diff --git a/tools/cooja/examples/jni_test/build.xml b/tools/cooja/examples/jni_test/build.xml index fc6c688bd..a90289303 100644 --- a/tools/cooja/examples/jni_test/build.xml +++ b/tools/cooja/examples/jni_test/build.xml @@ -1,58 +1,71 @@ + - + + + - - - - - + + + + -Win32 cygwin users may try: - COMPILER_ARGS= -mno-cygwin -I....../jdk1.5.0/include -I....../jdk1.5.0/include/win32 +Cygwin users may try: + COMPILER_ARGS = -mno-cygwin -I....../jdk1.5.0/include -I....../jdk1.5.0/include/win32 LINKER_ARGS_1 = --add-stdcall-alias /usr/lib/mingw/dllcrt2.o LINKER_ARGS_2 = -L/usr/lib/mingw -lmingw32 -lmingwex -lmsvcrt - Only for level 1, try the following compiler arguments: - COMPILER_ARGS= -mno-cygwin -I....../jdk1.5.0/include -I....../jdk1.5.0/include/win32 -Wl,--add-stdcall +Note for Windows users with recent Cygwin: +In recent (early 2007) MinGW-Cygwin versions, the JNI support has been removed/limited. +This may cause COOJA not to be able to load libraries generated using gcc's -mno-cygwin flag. +One possible solution is to download "real" MinGW (http://www.mingw.org), and install it separately +from Cygwin (for example in c:\mingw). Try using the following settings: + + COMPILER_ARGS = -Wall -D_JNI_IMPLEMENTATION_ -I'$(JAVA_HOME)/include' -I'$(JAVA_HOME)/include/win32' + LINK_COMMAND_1 = gcc -shared -Wl,-Map=$(MAPFILE) -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -o $(LIBFILE) + LINK_COMMAND_2 = The COOJA Simulator - JNI Tests -There examples may help understand errors during compilation from inside COOJA. -For some examples; "ant help". +------------------------------- - -ant level1 - Runs JNI test level 1: - [compilation test] - Compiles level1.c to level1.library, using only c compiler. - Java class loads the library and calls a simple native function. +These tests can be used to help understand COOJA errors, and to configure COOJA for new users. +For COOJA to compile JNI libraries successfully, tests 2-5 must be completed. -ant level2 +You may have to change the configuration (4 properties) in this file (build.xml). +When all tests pass, the settings should be entered into the COOJA External tool settings dialog. + +To run the first test: + > ant level2 + +For more information including configuration examples: + > ant help + +> ant level2 Runs JNI test level 2: [compilation test] Compiles level2.c to level2.library, using both c compiler and linker. Java class loads the library and calls a simple native function. -ant level3 +> ant level3 Runs JNI test level 3: [map file parsing test] Compiles java + c. The map file is parsed, and information about data+bss sections is outputted. -ant level4 +> ant level4 Runs JNI test level 4: [fetching reference var] Calculates offset between relative (mapfile) and absolute memory. A simple native function increases two counters (from both data and bss sections). -ant level5 +> ant level5 Runs JNI test level 5: [fetches and restores memory segments - the final test] A simple native function increases two counters (from both data and bss sections). @@ -67,6 +80,8 @@ ant level5 + + @@ -74,80 +89,81 @@ ant level5 - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/tools/cooja/examples/jni_test/level3/Level3.java b/tools/cooja/examples/jni_test/level3/Level3.java index 023471ba5..8fe806b8f 100644 --- a/tools/cooja/examples/jni_test/level3/Level3.java +++ b/tools/cooja/examples/jni_test/level3/Level3.java @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: Level3.java,v 1.2 2007/01/11 14:26:47 fros4943 Exp $ + * $Id: Level3.java,v 1.3 2007/09/05 18:39:42 fros4943 Exp $ */ import java.io.*; @@ -44,7 +44,7 @@ public class Level3 { "^.data[ \t]*0x([0-9A-Fa-f]*)[ \t]*0x[0-9A-Fa-f]*[ \t]*$"; final static private String dataSectionSizeRegExp = "^.data[ \t]*0x[0-9A-Fa-f]*[ \t]*0x([0-9A-Fa-f]*)[ \t]*$"; - + static { System.load(new File("level3.library").getAbsolutePath()); } @@ -65,20 +65,20 @@ public class Level3 { System.err.println("Parsing map file"); int relDataSectionAddr = loadRelDataSectionAddr(mapContents); - int dataSectionSize = (int) loadDataSectionSize(mapContents); + int dataSectionSize = loadDataSectionSize(mapContents); int relBssSectionAddr = loadRelBssSectionAddr(mapContents); - int bssSectionSize = (int) loadBssSectionSize(mapContents); + int bssSectionSize = loadBssSectionSize(mapContents); System.err.println("Found relative data section address: 0x" + Integer.toHexString(relDataSectionAddr)); System.err.println("Found data section size: 0x" + Integer.toHexString(dataSectionSize)); System.err.println("Found relative bss section address: 0x" + Integer.toHexString(relBssSectionAddr)); System.err.println("Found bss section size: 0x" + Integer.toHexString(bssSectionSize)); - - if (dataSectionSize != 4) { + + if (dataSectionSize < 4) { System.err.println("Data section size is " + Integer.toHexString(dataSectionSize) + " but should be 0x4!"); System.exit(1); } - if (bssSectionSize != 4) { + if (bssSectionSize < 4) { System.err.println("BSS section size is " + Integer.toHexString(bssSectionSize) + " but should be 0x4!"); System.exit(1); } @@ -87,13 +87,13 @@ public class Level3 { private static Vector loadMapFile(File mapFile) { Vector mapContents = new Vector(); - + try { BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream(mapFile))); - + while (in.ready()) { mapContents.add(in.readLine()); @@ -105,40 +105,48 @@ public class Level3 { System.err.println("IO error: " + e); return null; } - + return mapContents; } private static int loadRelDataSectionAddr(Vector mapFile) { String retString = getFirstMatchGroup(mapFile, dataSectionAddrRegExp, 1); - if (retString != null) + if (retString != null) { return Integer.parseInt(retString.trim(), 16); - else return 0; + } else { + return 0; + } } private static int loadDataSectionSize(Vector mapFile) { String retString = getFirstMatchGroup(mapFile, dataSectionSizeRegExp, 1); - if (retString != null) + if (retString != null) { return Integer.parseInt(retString.trim(), 16); - else return 0; + } else { + return 0; + } } private static int loadRelBssSectionAddr(Vector mapFile) { String retString = getFirstMatchGroup(mapFile, bssSectionAddrRegExp, 1); - if (retString != null) + if (retString != null) { return Integer.parseInt(retString.trim(), 16); - else return 0; + } else { + return 0; + } } private static int loadBssSectionSize(Vector mapFile) { String retString = getFirstMatchGroup(mapFile, bssSectionSizeRegExp, 1); - if (retString != null) + if (retString != null) { return Integer.parseInt(retString.trim(), 16); - else return 0; + } else { + return 0; + } } private static String getFirstMatchGroup(Vector lines, String regexp, int groupNr) {