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

时间:2017-09-19 10:10:15

标签: 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机箱上重现此行为,因此我猜测这是由客户机器上的某些操作系统设置引起的。

有人知道如何关闭它吗?

1 个答案:

答案 0 :(得分:0)

您可以使用:

System.loadLibrary("libraryname");

它将正确扩展为系统特定的表示法。或者您可以使用:

System.load("you_can_have_anything_you_like_here")

在第二种情况下,您需要做的就是指向文件的正确位置。如果您正在寻找跨系统开发,您可能有兴趣在JAR中打包您的本机代码。看看这里的示例代码,其中库来自JAR文件

section 3.5.5 of Frank's Quick R Tutorial

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

另一种方法是通过存根:https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo031

在这种情况下,您可以随意加载库并随意执行(例如,动态更改本机代码)。