jniAan de slag met jni


Opmerkingen

Deze sectie geeft een overzicht van wat jni is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen jni vermelden en een link naar de gerelateerde onderwerpen bevatten. Omdat de Documentatie voor jni nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Aan de slag met JNI

JNI betekent Java Native Interface. Het is een mechanisme voor het aanroepen van een native code vanuit een Java-toepassing die wordt uitgevoerd onder JVM-besturing en vice versa. Native code betekent code die is samengesteld voor het doelplatform. Native code code is meestal geschreven in C of C ++ maar het kan worden geschreven in elke taal die compiler voor het doelplatform heeft.

JNI is handig wanneer

  • Een Java-toepassing moet toegang hebben tot platformspecifieke bronnen en er is geen Java-bibliotheek met de vereiste functionaliteit. De bron kan specifieke hardware, sensoren of wat dan ook zijn.
  • Een Java-toepassing moet een prestatiekritieke taak uitvoeren en native code kan sneller zijn of minder voetafdruk hebben dan Java Bytecode. Wees echter te zelfverzekerd JVM is in staat om veel optimalisatie te doen en een naïeve implementatie in C / C ++ zal waarschijnlijk langzamer zijn.
  • Een toepassing in C / C ++ (of een andere taal) wil een functie in een Java-bibliotheek gebruiken.

Om te beginnen met JNI heb je nodig

  • JDK of iets dat Java kan compileren naar bytecode.
  • Compiler voor het compileren van de native code.

Het volgende hallo-wereldvoorbeeld is een eenvoudige Java-toepassing die een C-functie aanroept. Het voorbeeld kan worden gecompileerd door javac uit JDK en gcc C compiler.

Java-code:

public class JNIExample {

    public static void main(String[] args) {
       // The loadLibrary search for the native library (libnative.so in this case)
       System.loadLibrary("native");
       String s = "Hello JNI";
       JNIExample example = new JNIExample();
       example.doPrint(s);
   }

   // The method with native code (written in C) must be declared with native prefix
   public native void doPrint(String message);

}
 

C code:

#include <jni.h>
#include <stdio.h>

/* the function that is called from java must be declered with decorators
 * JNIEXPORT and JNICALL.
 * The function name is constructed as Java_ClassName_MethodName
 * Function parameters correspond parameters in java but there are 2 extra parameters
 * JNIEnv is a pointer to java envoronmet and jobject is a reference to caller object.
 * Caller object is the instance of the JNIExample in this case.
 */
JNIEXPORT void JNICALL Java_JNIExample_doPrint(JNIEnv *e, jobject obj, jstring message) {
    const char *c_message;
    /* It is necessary to convert java objects like string to something C native */
    c_message = (*e)->GetStringUTFChars(e, message, NULL);
    printf("%s\n", c_message);
    /* in the end it is necessary to free resources allocated by Get above */
    (*e)->ReleaseStringUTFChars(e, message, c_message);
}