
JNI isn’t difficult to use… …and it doesn’t have to be complicated! But it can be a very powerful and useful tool… …when used correctly 2 Contents But wait, there’s more! • What is it and what can it do? • When should or shouldn’t you use it? • Basic JNI application overview • The 4-steps to JNI application happiness • Some JNI specifics – Naming and typing • Demos – Some helper functionality • Further reading • Calling Java code from native code 3 4 1 What is JNI? So what can JNI do? • Standard part of Java • Execute native code from within Java • Allows you to integrate native code – Call native methods (written in, say, C) into Java applications • Execute Java code from within native code • Can also be used to embed a JVM into a – Catch & throw exceptions native application – Call methods • Provides a standard means of interaction – Use objects between Java code and native code • Embed the JVM in native application (via the Invocation API) 5 6 Why use JNI? Why not use JNI? • Direct hardware access / support • “The system absolutely has to be written in • Reuse existing libraries Java!” • Time-critical code / operations • Using a platform-dependant library makes • Better support for something in another your application (more) platform- language… dependant • Codebase becomes more complicated – More opportunity for memory leaks, etc. 7 8 2 Theoretical complexity… Real-world Complexity… 9 10 A basic JNI application Creating a JNI application 1. Decide what functionality needs to be in native code 2. Write & compile Java wrapper class 3. Create native (C / C++) header using • JNI provides the link between the application javah and some native code 4. Import header into new DLL and • Also allows the native code to access the JVM populate functions (and thus the application) 11 12 3 1. Design 2. Create Java wrapper class • Try to keep native code to a minimum • Normal Java class, plus: • Avoid passing platform-dependant stuff (if – native methods possible) – static block that loads the native library via • Clearly divided functionality (one function a call to System.loadLibrary per action) • Native methods have no implementation • Might need several native libraries (like abstract methods) • Compile class as normal 13 14 3. Generate native header 4. Write native code • Use javah , which comes with the JDK: • Import header javah –jni <wrapper class name> • Each native method in the wrapper class for example, should have a munged equivalent javah –jni MyPkg.MyWrapper • Implement the functions • Note package name (if used) must be – The JNIEnv object can be used to access specified! various helpful bits of the JNI • This produces <wrapper class name>.h – Other parameters are converted to “C” types 15 16 4 4a. Native compiler setup • Need to add JNI headers to include path: – <java install>\include AND – <java install>\include\<platform> Demo • For example: – C:\jdk1.5.0_15\include – C:\jdk1.5.0_15\include\win32 17 18 JNI name munging The JNI Environment object • Native function name is created from: • JNIEnv object used to access JNI – The prefix Java_ functionality – Mangled fully-qualified class name • Passed as first two parameters to all – A separator (“_”) native functions – Mangled method name • Examples of use: – For overloaded native methods, two – Retrieving array elements underscores followed by the mangled – Getting strings argument signature – Accessing Invocation API • May overload non-native methods • See chapters 4 and 5 of spec 19 20 5 Playing ‘hunt the library’ String operations • The argument passed to • Java uses UTF – need to convert strings System.loadLibrary is converted to – GetStringUTFChars platform naming convention, for example: – MUST ReleaseStringUTFChars – MyLib.dll for Win32 • Can also create new java.lang.Strings , – libMyLib.so for Solaris get region encoding, etc. • The library must be somewhere the JVM can find it • Any created object (or other allocated – System search path memory) must be freed when you’re done – Usually in the same directory as the with it! application 21 22 String helper functions Array operations • Primitive arrays vs. Object arrays • Primitives: – GetXXXArrayRegion – GetXXXArrayElements , ReleaseXXXArrayElements • Objects: – NewObjectArray – Get / SetObjectArrayElement – FindClass 23 24 6 Type signatures Calling Java code from JNI • Uses JVM type signature representation • Create Java wrapper class and native • Single letters for primitive types, or fully header as above qualified class names • Native code needs to know class, method name, and method signature of Java code • ( arg-types ) ret-type for a method it wants to call e.g. long foo (int n, String s) • JNIEnv->GetMethodID and gives (ILjava/lang/String;)J JNIEnv->CallXXXMethod • JNIEnv->GetStaticMethodID and JNIEnv->CallStaticXXXMethod 25 26 Accessing fields of objects • Basically the same as calling Java methods: GetFieldID() Demo GetXXXField() and SetXXXField() • Need an instantiated class, field name and signature • Can’t be used to get length of array – use GetArrayLength() 27 28 7 Gotchas Recommended reading • Package name when creating native • JNI Specification (Java 5): headers http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html • Memory leaks when working with strings • Sun JNI tutorial: • Multiple instances of the same library http://java.sun.com/docs/books/tutorial/information/download.html • System.load vs System.loadLibrary • Java Native Interface: Programmer’s Guide and Specification : http://java.sun.com/docs/books/jni/index.html 29 30 31 8.
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages8 Page
-
File Size-