我希望使用JNI实现一个基于C++库的java。不幸的是,当我想在java中使用共享库时,却找不到它。这个共享库的问题是它链接了另一个共享库。我有两个不同的案例,一个可以工作(但不应该使用),另一个不能。
Ana库必须始终是静态的。Clara库必须始终是共享的。当Bob库是静态的时,它可以工作,但它应该是共享的,并且应该包括Ana和Clara。
情况1(可以工作,并且可以加载到正确的java.library.path中)。
sharedlibJava.so链接: staticlibAna.a统计ClibBob.a sharedlibClara.so
情况2(无法工作,因为即使java.library.path是正确的,它也无法加载)。sharedlibBob.so链接: staticlibAna.a和sharedlibClara.so (基本的c++实现已经过测试,工作正常)
sharedlibJava.so链接: sharedlibBob.so ( java实现应该可以使用这个新的共享库)。
问题是,当我试图加载库时,它甚至在正确的java.library.path中都找不到它,即使它位于那里。
我真的很感谢任何关于这个问题的反馈。
发布于 2016-10-28 08:26:26
将你所有的路径位置放在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 location来调用代码
java -Djava.library.path=:./lib -cp target recipeNo023.HelloWorld
library: :./lib
Hello world!
Hello from another function!
有关完整的示例代码,请查看此处:
https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo023
https://stackoverflow.com/questions/40266528
复制相似问题