我在AIX 6.1和SLES 11上遇到了一个特殊的问题。我正在尝试使用so
调用在Java中加载System.loadLibrary()
文件。以下是示例程序:
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");
}
}
当我用Java 1.5编译这段代码时,它可以正常工作。但是当我用Java 1.6编译它时,它说UnsatisfiedLinkError
。我不明白我怎么可能得到这个错误。我正在运行的方式是:
javac jniTest.java
java -Djava.library.path=. jniTest
so
文件位于我运行代码的当前目录中。
在此之前,我尝试过的事情:
给出绝对路径 - 没有用
使用Runtime.getRuntime().loadLibrary()
- 无效
知道我做错了吗?
答案 0 :(得分:2)
在使用JNI时,我认为您不应该使用“.so
”扩展名。只需System.loadLibrary("libSample");
答案 1 :(得分:0)
只是为了扩展Jim所说的内容:你不需要.so扩展名或文件的'lib'部分。这应该有效(至少,它适用于1.6):
try
{
System.loadLibrary("Sample");
System.out.println("Loaded!!!");
}
catch(UnsatisfiedLinkError e)
{
System.out.println("unsatisfiedlinkerror");
}
答案 2 :(得分:0)
我想到的前三件事:
System.loadLibrary()
。如果您的库名为“libSample.so”,则调用应为System.loadLibrary("Sample")
。 (这已在其他答案中提出)java -version
,如果部分响应类似于OpenJDK Runtime Environment (build 1.6.0_0-b11)
,请尝试安装官方Sun JDK,看看是否有效。答案 3 :(得分:0)
另一种可能性是Java中的本机函数不与库中的函数对齐。 JNI函数有一个非常明确定义的命名约定。 例如,如果你在java中有一个应该调用c / c ++库函数的函数:
package my.packagename;
public class Test {
static {
System.loadLibrary("Sample");
}
public native void testJNI(int arg1);
}
c或c ++中的相应函数必须是(假设你的包名是“com.packagename”):
JNIEXPORT void JNICALL Java_my_packagename_Test_testJNI(JNIEnv* env, jobject obj, jint arg1) {
// ... code here
}
我经历过的原因是,如果函数名称不匹配,则抛出UnsatisfiedLinkError。