System.loadLibrary在java 1.6上失败,但在java 1.5上工作
我在AIX6.1和SLES11上遇到了一个特殊的问题。我正在尝试使用System.loadLibrary在java 1.6上失败,但在java 1.5上工作,java,java-native-interface,aix,Java,Java Native Interface,Aix,我在AIX6.1和SLES11上遇到了一个特殊的问题。我正在尝试使用System.loadLibrary()调用在Java中加载so文件。以下是示例程序: public class jniTest { public static void main(String[] args) { try { System.loadLibrary("libSample.so"); System.out.println("Loaded!!!
System.loadLibrary()
调用在Java中加载so
文件。以下是示例程序:
public class jniTest
{
public static void main(String[] args)
{
try
{
System.loadLibrary("libSample.so");
System.out.println("Loaded!!!");
}
catch(UnsatisfiedLinkError e)
{
System.out.println("unsatisfiedlinkerror");
}
}
当我用Java1.5编译这段代码时,它工作正常。但是,当我用Java1.6编译它时,它会显示unsatifiedlinkerror
。我不明白我怎么可能会犯这个错误。我的跑步方式是:
javac jniTest.java
java -Djava.library.path=. jniTest
so
文件位于运行代码的当前目录中。
在此之前,我尝试过的事情:
Runtime.getRuntime().loadLibrary()
-无效你知道我做错了什么吗?我不认为你在使用JNI时应该有“
。所以
”扩展。尝试使用System.loadLibrary(“libSample”)代码>仅扩展Jim所说的内容:您不需要.so扩展名或文件的“lib”部分。这应该有效(至少在1.6中对我有效):
我想到的前三件事:
确保库位于java库路径上(您已经完成了此操作)
确保正确使用了System.loadLibrary()
。如果您的库名为“libSample.so”,则调用应为System.loadLibrary(“Sample”)
。(其他答复中也提出了这一点)
考虑到OpenJDK下的库可能存在问题,您正在使用的是Java虚拟机。运行命令java-version
,如果响应的一部分类似于OpenJDK运行时环境(build 1.6.0_0-b11)
,请尝试安装正式的Sun JDK,看看是否有效
另一种可能是Java中的本机函数与库中的函数不一致。JNI函数有一个非常明确的命名约定。
例如,如果您在java中有一个函数应该调用c/c++库函数:
package my.packagename;
public class Test {
static {
System.loadLibrary("Sample");
}
public native void testJNI(int arg1);
}
< > C或C++中的相应函数必须是(假设你的包名是“COM.PACGAGEName”):
我之所以这样做,是因为如果函数名不匹配,就会抛出一个不满意的链接错误。当您使用1.5编译它,但使用1.6运行它时会发生什么?您是否检查了不满意的链接错误消息?它应该会给出问题的地方一些提示。可能已经找到了库,但Java 6无法加载。在SLES下,ldd libSample.so
的结果是什么?我想AIX中没有ldd。一个可能的原因是libSample.so依赖于JSE 1.5 library.dump-Tv libSample.so将显示其依赖项并搜索path.gxx_gcc/g++内容。你的共享库是用gcc构建的吗?嗨,Jim,我试过了,但是没有成功,它仍然在说不满意的链接错误这已经晚了,但是对于任何阅读本文的人来说。必须使用loadLibrary
的平台名称,即在本例中,平台名称应为Sample
。该函数将添加lib
和´。因此,`如果您运行的是linux或.dll
,如果您运行的是windows。您好,rm5248,也尝试了此函数,但对我不起作用。我使用的是AIX6.1。但同样的代码适用于Java1.5版本。Hi Rob,我使用的是官方的sun jdk,#/usr/java6/bin/java-version java version“1.6.0”java(TM)SE运行时环境(build pap3260-2007112301)IBM J9 VM(build 2.4,J2RE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260-2007112115015(支持JIT)J9VM-20071121_015015_bHdSMR JIT-r9_20071121_1330 GC-20071031_AA)JCL-20071118_01
package my.packagename;
public class Test {
static {
System.loadLibrary("Sample");
}
public native void testJNI(int arg1);
}
JNIEXPORT void JNICALL Java_my_packagename_Test_testJNI(JNIEnv* env, jobject obj, jint arg1) {
// ... code here
}