当我尝试在运行时加载 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/