【发布时间】:2017-09-19 10:10:15
【问题描述】:
我在我们的一台客户机器上尝试在运行时加载 JNI 库时遇到了一个奇怪的行为。
当尝试使用
加载库时System.load("libtestlibrary.so")
我得到一个
liblibtestlibrary.so.so: cannot open shared object file: No such file or directory
似乎给定的库名称(错误地)以“lib”为前缀并以“.so”为后缀,因此无法找到我们的库。
这只发生在一台机器上 (AIX 6)。我无法使用完全相同的 JRE 在我们自己的 AIX 6 机器上重现此行为,所以我猜这是由客户机器上的某些操作系统设置引起的。
有人知道如何关闭它吗?
【问题讨论】:
-
尝试
System.load("/fullpath/libtestlibrary.so")或System.loadLibrary("testlibrary")。后者与设置属性java.library.path相结合。 -
注意:使用实用程序
truss(1)进行调试,带有选项-f -
不是路径的问题,库是在当前目录下找到的。问题是通过在库名称前面加上“lib”并在后面加上“.so”来修改库名称。我知道我可以使用
System.load("testlibrary")加载库,但在这种情况下,代码将在所有其他平台上失败。据我了解文档说明,System.loadLibrary("testlibrary")应用于本机库。 -
一些注意事项: 1. 在 Unix 中,当前目录在搜索共享库时很少或从不使用;定义要搜索的目录的是
LIBPATH(以及使用Java 时的java.library.path)。 2. 没有方法可以加载“非本地库”(例如,使用 64 位 Java 时的 32 位共享对象,反之亦然)。 3. 你得到的错误信息可能是假的,如果对真正发生的事情感兴趣,请使用 gdb 或 truss。另请阅读我的第一条评论。
标签: java java-native-interface shared-libraries