2016-10-26 4 views
0

Ich möchte eine Java-Implementierung basierend auf einer C++ - Bibliothek mithilfe von JNI erstellen. Wenn ich die Shared Library in Java verwenden möchte, kann sie leider nicht gefunden werden. Das Problem mit dieser gemeinsam genutzten Bibliothek ist, dass sie eine andere gemeinsam genutzte Bibliothek verbindet. Ich habe zwei verschiedene Fälle, in denen einer funktioniert (aber nicht verwendet werden sollte) und der andere nicht.Problem beim Laden freigegebener Bibliotheken in Java

Die Ana-Bibliothek muss immer statisch sein. Die Clara-Bibliothek muss immer geteilt werden. Es funktioniert, wenn die Bob-Lib statisch ist, aber es sollte geteilt werden und es sollte Ana und Clara enthalten.

Fall 1 (Works und kann in der richtigen java.library.path geladen werden).

sharedlibJava.so Links: staticlibAna.a staticlibBob.a sharedlibClara.so

Fall 2 (funktioniert nicht, weil es nicht einmal geladen werden kann, obwohl die java.library.path korrekt ist). sharedlibBob.so Links: staticlibAna.a und sharedlibClara.so (die grundlegende C++ Implementierung getestet und es funktioniert ohne Probleme)

sharedlibJava.so Links: sharedlibBob.so (die Java-Implementierung sollte mit dieser neuen Shared Library zur Verfügung).

Das Problem ist, dass wenn ich versuche, die Bibliothek zu laden, es nicht einmal in der richtigen java.library.path findet, obwohl es dort befindet.

Ich würde mich sehr über Feedback zu diesem Thema freuen.

Antwort

0

Setzen Sie alle Pfadpositionen auf LD_LIBRARY_PATH. Alternativ können Sie sie auch in -Djava.library.path einfügen.

Wenn Sie den Code richtig kompiliert haben, sollten Sie beim Zugriff auf die gemeinsam genutzte Bibliothek keine Probleme feststellen.

Wenn Sie einen Code als gemeinsamen lib kompilieren, und es dann mit gemeinsamen lib durch die Verknüpfung von anderen Code beziehen, sollte es

cc -g -shared -fpic c/recipeNo023_AnotherFunction.c -o lib/libAnotherFunction.$(EXT) 
cc -g -shared -fpic -I${JAVA_HOME}/include -I${JAVA_HOME}/include/$(ARCH) c/recipeNo023_HelloWorld.c -L./lib -lAnotherFunction -o lib/libHelloWorld.$(EXT) 

Dann gut funktionieren, sollten Sie in der Lage sein, den Code aufrufen, indem lib Lage innerhalb -Djava.library.path

java -Djava.library.path=:./lib -cp target recipeNo023.HelloWorld 
library: :./lib 
Hello world! 
Hello from another function! 

Für den vollständigen Beispielcode, werfen Sie einen Blick hier:

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

Verwandte Themen