【问题标题】:Java System.load(libName) looks for wrong lib nameJava System.load(libName) 查找错误的库名称
【发布时间】: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


【解决方案1】:

你可以使用:

System.loadLibrary("libraryname");

它将被适当地扩展为系统特定的符号。或者你可以使用:

System.load("you_can_have_anything_you_like_here")

在第二种情况下,您需要做的就是指向文件的正确位置。如果您正在寻找跨系统开发,您可能会对将本机代码打包到 JAR 中感兴趣。在此处查看从 JAR 文件中获取库的示例代码

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo031

另外,请确保LD_LIBRARY_PATH 中提供了其他库。请注意,java.library.path 仅对您的“第一个”本机库有效。如果您的代码使用其他一些共享库,则必须使用 rpath 编译或确保库在系统范围内可见。

另一种方法是通过存根:http://jnicookbook.owsiak.org/recipe-No-018/

在这种情况下,您可以根据需要加载库并做任何您想做的事情(例如,即时更改本机代码)。

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2011-08-03
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多