在Java

时间:2016-10-26 15:38:10

标签: java linux windows java-native-interface shared-libraries

我希望使用JNI基于C ++库创建一个java实现。不幸的是,当我希望在java中使用共享库时,无法找到它。此共享库的问题是它链接另一个共享库。我有两个不同的情况,一个工作(但不应该使用)而另一个不工作。

Ana lib必须始终是静态的。必须始终共享Clara lib。当Bob lib是静态的时,它可以工作,但它应该被共享,它应该包括Ana和Clara。

案例1(Works并且可以加载到正确的java.library.path中)。

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

案例2(不起作用,因为即使java.library.path正确也无法加载)。 sharedlibBob.so链接:staticlibAna.a和sharedlibClara.so(基本的c ++实现经过测试,没有问题)

sharedlibJava.so links:sharedlibBob.so(使用这个新的共享库可以使用java实现)。

问题在于,当我尝试加载库时,它甚至没有在正确的java.library.path中找到它,即使它位于那里。

我真的很感激有关此问题的任何反馈。

1 个答案:

答案 0 :(得分: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中传递lib位置来调用代码

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

有关完整示例代码,请查看此处:

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