2017-06-06 8 views
0

Alle Führer zu JNI Ich habe gesehen (zB JNI runtime linking) empfehlen, dass ich meine JNI Bibliotheken gegen libjvm.so verlinken:libjvm.so: zum Verknüpfen oder nicht zum Verknüpfen?

$ gcc -I${JAVA_HOME}/include -c -o test.o test.c 
$ gcc -shared -o libtest.so test.o -L${JAVA_HOME}/jre/lib/i386/server -Wl,-rpath,${JAVA_HOME}/jre/lib/i386/server -ljvm 

Wenn meine benutzerdefinierte Bibliothek ist in C++ geschrieben und verwendet die C++ JNI API, kann ich klar siehe die entsprechenden schwachen Symbole in nm -C Ausgabe:

00000690 W JNIEnv_::ThrowNew(_jclass*, char const*) 
00000672 W JNIEnv_::FindClass(char const*) 

Dennoch, wenn ich nicht Erwähnung -ljvm auf der Kommandozeile tun , setzt die benutzerdefinierten native Bibliothek gut zu funktionieren, wahrscheinlich, weil libjvm.so wird automatisch von beliebigen Java-Prozess geladen.

Können Sie mir sagen, wenn es absolut notwendig ist, explizit gegen libjvm.so zu verknüpfen?

Antwort

1

Ich denke, Sie brauchen es, wenn Sie wollen, dass es umgekehrt läuft.

Beispielsweise möchten Sie JVM aus C/C++ - Code erstellen und JVM-Methoden aufrufen.

Zum Beispiel müssen wir hier mit ljvm verknüpfen, sonst werden Sie keine Symbole in Ihrem C-Code finden.

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo027

Verwandte Themen