Java System.load(libName) 查找错误的库名称

标签 java java-native-interface shared-libraries

当我尝试在运行时加载 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.loadLibrary("libraryname");

它将被正确扩展为系统特定的符号。或者您可以使用:

System.load("you_can_have_anything_you_like_here")

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

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

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

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

在这种情况下,您可以根据需要加载库并执行任何您喜欢的操作(例如即时更改 native 代码)。

关于Java System.load(libName) 查找错误的库名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46297723/

相关文章:

java - Spring Boot URl 映射

python - 如何查看动态库文件(.dylib)的函数定义?

linux - 加载共享库 libstdc++.so.5 时出错

java - 用于流式传输 mp3 文件的 ID3v2 库?

使用 ExecutorService 时出现 java.util.ConcurrentModificationException

java - (Java,mad-libs 游戏)我在一行上收到两个提示输入问题,而它们应该各有自己的一行

java - 通过 JNI 访问 C 中的缓存

java - 不能将 java int 传递给 jni 函数

java - jni 从 c/c++11 返回字符串数组并在 java 上使用而不在 c++ 端使用 for 循环?

c++ - 在 dll 中解析外部符号