The Java Native Interface

The Java Native Interface

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.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    8 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us