无法在JNI项目中加载.so

时间:2012-07-07 21:20:48

标签: java java-native-interface

我已经阅读了许多类似的问题,但仍然对这个项目感到困惑。我正在尝试使用64位Ubuntu 11.04上的Eclipse进行非常简单的JNI项目。

我已正确构建了我的.so文件。我知道这是因为当我从Java程序中使用System.load(“/ exact / path / to / my / libcproject.so”)时,我可以调用它。但是当我尝试使用System.loadLibrary(“libcproject”)时,我得到了一个不满意的链接错误。

这是我简单的Java程序:

package pkg;
public class MyClass {
static {
    System.out.println("java.library.path: " + System.getProperty("java.library.path"));
    System.loadLibrary("libcproject");
}
private native String foo(String input);
public static void main(String[] args) {
    MyClass mc = new MyClass();
    String output = mc.foo("input");
    System.out.println(output);
}
}

如您所见,我正在打印java.library.path。当我运行程序时,我得到:

java.library.path: /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64/server:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/../lib/amd64:/home/mlevin/workspace/cproject/Debug:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
input

“输入”是我的C函数返回的内容(它只是让你回复你提供的内容)。

如果我将System.load调用更改为System.loadLibrary(“libcproject”),我会得到不满意的链接错误,即使你可以从输出中看到/ home / mlevin / workspace / cproject / Debug,这是libcproject.so所在的位置,位于java.library.path。

java.library.path: /usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64/server:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/amd64:/usr/lib/jvm/java-6-sun-1.6.0.26/jre/../lib/amd64:/home/mlevin/workspace/cproject/Debug:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libcproject in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at pkg.MyClass.<clinit>(MyClass.java:7)
Could not find the main class: pkg.MyClass.  Program will exit.

我对这一点感到非常困惑。有什么建议吗?

由于

2 个答案:

答案 0 :(得分:4)

删除lib前缀,如下所示:

System.loadLibrary("cproject");

Java在开始时自动添加lib,在结束时自动添加.so(无论如何,对于类Unix操作系统。在Windows上,它会在末尾添加.dll。)

答案 1 :(得分:0)

.export LD_LIBRARY_PATH =。,从而设置当前目录的库路径,找到所需的Java文件。