2016-10-26 61 views
0

我希望基於使用JNI的C++庫進行java實現。不幸的是,當我想在java中使用共享庫時,無法找到它。這個共享庫的問題在於它鏈接了另一個共享庫。我有兩個不同的情況下工作(但不應該使用),另一個不。發佈在Java中加載共享庫

Ana lib必須始終是靜態的。 Clara lib必須始終共享。它在Bob lib是靜態的時候工作,但它應該被共享,它應該包括Ana和Clara。

案例1(Works和可以加載正確的java.library.path)。

sharedlibJava.so鏈接:staticlibAna.a staticlibBob.a sharedlibClara.so

案例2(不起作用,因爲它不能被加載,即使的java.library.path是正確的)。 sharedlibBob.so鏈接:staticlibAna.a和sharedlibClara.so(基本的C++實現的測試,它的工作原理沒有問題)

sharedlibJava.so鏈接:sharedlibBob.so(Java實現應該使用這個新的共享庫可用)。

問題是,當我嘗試加載庫時,即使它位於那裏,它甚至無法在正確的java.library.path中找到它。

我真的很感激任何關於這個問題的反饋。

回答

0

將所有路徑位置放在LD_LIBRARY_PATH上。或者,將它們放入-Djava.library.path

如果您已正確編譯代碼,我認爲您在訪問共享庫時不會遇到問題。

如果您編譯一個代碼共享庫,然後通過鏈接其他代碼共享庫引用它,它應該只是罰款

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) 

然後,你應該能夠通過傳遞調用代碼-Djava.library.path

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

對於完整的示例代碼中的lib位置,看看這裏:

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