如何正确地将共享库加载到Eclipse中

时间:2017-02-03 16:41:24

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

我在Linux上使用JNI,我在检索共享库方面遇到了麻烦。

特别是,我使用单个SO文件中包含的本机函数,但它与其他SO文件(我放在同一目录中)有依赖关系。

现在,我正在使用System.load(absolutePath)加载主SO,但我收到此错误:

...GMApiJNI64.so: libgpc64.so: cannot open shared object file: No such file or directory

其中GMApiJNI64.so是我正在使用的主库

到现在为止我试图:

  

我还能做什么?

1 个答案:

答案 0 :(得分:2)

简短回顾一下。我不知道你的确切环境。但我可以重现并修复与你类似的问题:

> git clone https://github.com/mkowsiak/jnicookbook.git
> cd jnicookbook/recipeNo023
> make
> make test
/usr/lib64/jvm/java/bin/java -Djava.library.path=:./lib -cp target recipeNo023.HelloWorld
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/test/workspace/jnicookbook/recipeNo023/lib/libHelloWorld.so: libAnotherFunction.so: cannot open shared object file: No such file or directory
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at recipeNo023.HelloWorld.<clinit>(HelloWorld.java:11)
Makefile:14: recipe for target 'test' failed
make: *** [test] Error 1

现在,让我们看一下lib

会发生什么
test@linux-875l:~/workspace/jnicookbook/recipeNo023> ldd lib/libHelloWorld.so 
    linux-vdso.so.1 (0x00007ffd34936000)
    libAnotherFunction.so => not found
    libc.so.6 => /lib64/libc.so.6 (0x00007f470c182000)
    /lib64/ld-linux-x86-64.so.2 (0x0000556276681000)

它不存在。我们可以做的是将它添加到LD_LIBRARY_PATH

test@linux-875l:~/workspace/jnicookbook/recipeNo023> export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/lib

然后再试一次。的工作原理。

test@linux-875l:~/workspace/jnicookbook/recipeNo023> make test/usr/lib64/jvm/java/bin/java -Djava.library.path=:/home/test/workspace/jnicookbook/recipeNo023/lib:./lib -cp target recipeNo023.HelloWorld
library: :/home/test/workspace/jnicookbook/recipeNo023/lib:./lib
Hello world!
Hello from another function!

您可以在Eclipse中执行的操作是在项目设置中提供lib的位置:

Project -> Properties -> Java Build Path 
    -> Libraries -> JRE System Library 
    -> Native library location -> Edit... 
    -> External folder

更新

如果你在LD_LIBRARY_PATH上没有libgpc64.so,那么仍然可能存在问题。

还有一件事可以尝试。

在构建GMAapiJNI64.so时,请尝试使用以下命令:

-Wl,-rpath=$LOCATION_OF_LIBGPC -lgpc64

这一次,Eclipse应该能够正确启动你的代码,即使你没有LD_LIBRARY_PATH中的lib