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

Java load(libName)查找错误的库名称,java,java-native-interface,shared-libraries,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”,因此无法找到我们的库 这只发生在一台机器上(AIX6)。我无法使用完全相同的JRE在我们

当我试图在运行时加载JNI库时,在我们的一个客户机器上遇到了一个奇怪的行为

在尝试加载带有的库时

System.load("libtestlibrary.so")
我得到一份工作

liblibtestlibrary.so.so: cannot open shared object file: No such file or directory
似乎给定的库名称(错误地)前缀为“lib”,后缀为“.so”,因此无法找到我们的库

这只发生在一台机器上(AIX6)。我无法使用完全相同的JRE在我们自己的AIX6机器上重现这种行为,所以我猜这是由客户机器上的一些操作系统设置造成的

有人知道怎么关掉这个吗

您可以使用:

System.loadLibrary("libraryname");
它将适当扩展为系统特定的符号。或者您可以使用:

System.load("you_can_have_anything_you_like_here")
在第二种情况下,您所需要做的就是指向文件的正确位置。如果您正在寻找跨系统开发,您可能会对将本机代码打包到JAR中感兴趣。在这里查看一个示例代码,其中库取自JAR文件

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

另一种方法是通过存根:

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

您可以使用以下任一方法:

System.loadLibrary("libraryname");
它将适当扩展为系统特定的符号。或者您可以使用:

System.load("you_can_have_anything_you_like_here")
在第二种情况下,您所需要做的就是指向文件的正确位置。如果您正在寻找跨系统开发,您可能会对将本机代码打包到JAR中感兴趣。在这里查看一个示例代码,其中库取自JAR文件

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

另一种方法是通过存根:


在这种情况下,您可以随心所欲地加载库并执行任何操作(例如动态更改本机代码)。

尝试
System.load(“/fullpath/libtestlibrary.so”)
System.loadLibrary(“testlibrary”)
。后者与相应地设置属性
java.library.path
相结合。注意:使用实用工具
truss(1)
进行调试,使用选项
-f
问题不在于路径,库位于当前目录中。问题是修改库名,在其前面加上“lib”并在其后面加上“.so”。我知道我可以使用
System.load(“testlibrary”)
加载库,但在这种情况下,代码将在所有其他平台上失败<就我对文档的理解而言,code>System.loadLibrary(“testlibrary”)
应该用于本机库。在Unix中,搜索共享库时很少或从未使用当前目录;定义要搜索的目录的是
LIBPATH
(和
java.library.path
(使用java时)。2.如果没有方法,则无法加载“非本机库”(例如使用64位Java时加载32位共享对象,反之亦然)。3.您得到的错误消息可能是假的,如果您对实际发生的情况感兴趣,请使用gdb或truss。另外,请阅读我的第一条评论。请尝试
System.load(“/fullpath/libtestlibrary.so”)
System.loadLibrary(“testlibrary”)
。后者与相应地设置属性
java.library.path
相结合。注意:使用实用工具
truss(1)
进行调试,使用选项
-f
问题不在于路径,库位于当前目录中。问题是修改库名,在其前面加上“lib”并在其后面加上“.so”。我知道我可以使用
System.load(“testlibrary”)
加载库,但在这种情况下,代码将在所有其他平台上失败<就我对文档的理解而言,code>System.loadLibrary(“testlibrary”)
应该用于本机库。在Unix中,搜索共享库时很少或从未使用当前目录;定义要搜索的目录的是
LIBPATH
(和
java.library.path
(使用java时)。2.如果没有方法,则无法加载“非本机库”(例如使用64位Java时加载32位共享对象,反之亦然)。3.您得到的错误消息可能是假的,如果您对实际发生的情况感兴趣,请使用gdb或truss。也请阅读我的第一条评论。