无法打开共享对象文件 - Java中的C ++库

时间:2015-01-24 22:41:54

标签: java c++ java-native-interface shared-libraries

我正在尝试在我的Java代码中使用C ++编译库。我将java.library.path设置为/usr/local/lib/,并且我已安装了库中的所有.so个文件。

但是,当我尝试运行Java应用程序时,我看到以下内容:

Native code library failed to load. 
java.lang.UnsatisfiedLinkError: /usr/local/lib/libA.so: libB.so.2.4: cannot open shared object file: No such file or directory

然而,文件似乎在那里:

ls /usr/local/lib/libB.so.2.4
lrwxrwxrwx 1 root root 20 Jan 24 16:33 /usr/local/lib/libB.so.2.4 -> libB.so.2.4.5

符号链接文件也存在。知道为什么找不到这个库吗?

2 个答案:

答案 0 :(得分:2)

Java能够加载库AlibA.so)的本机代码,当它运行该本机代码时,依赖于libB.so(但是,它是{s}在本地代码中 - 在JVM控件之外)。此时,您必须使用系统上的本机库。通常的机制是设置LD_LIBRARY_PATH环境变量使用ldconfig(根据手册页)部分说明

  

ldconfig创建必要的链接并缓存到最新的         在命令中指定的目录中找到的共享库         line,在文件/etc/ld.so.conf和受信任的目录(/ lib         和/ usr / lib)。缓存由运行时链接程序ld.so或ld-linux.so使用。

答案 1 :(得分:1)

如果您使用的是WebLogic:请确保在weblogic的USTART_LD_LIB-脚本中有一个名为wlstart的系统变量,该系统变量将覆盖LD_LIBRARY_PATH变量。因此,您需要设置此变量,还要将lib附加到此变量,并同时设置LD_LIBRARY_PATH

原因是您无法在手动启动应用程序之前继续导出变量。