java - 无法在 JNI 项目中加载 .so

标签 java java-native-interface

我已经通读了许多类似的问题,但仍然对这个项目感到困惑。我正在 Ubuntu 11.04 64 位上使用 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.

此时我很困惑。有什么建议吗?

谢谢

最佳答案

去掉 lib 前缀,像这样:

System.loadLibrary("cproject");

Java 自动在开头添加 lib 并在结尾添加 .so(无论如何,对于类 Unix 操作系统。在 Windows 上它添加 .dll到最后)。

关于java - 无法在 JNI 项目中加载 .so,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11378725/

相关文章:

java - 使用自定义 TableCellRenderer 更改单元格的背景

java - 无法在 Apache Tomcat 7 上运行应用程序

java - Android GTFS 应用程序

java - 在 JList 中有一个预选选项

android - 在 Android NDK 上通过 JNI 从 OpenGL ES 帧缓冲区创建位图图像

java - 将键盘事件从 java 发送到任何应用程序(屏幕键盘)

java - 静态方法中变量的竞争条件

cocoa - 从 Cocoa 应用程序使用 Lucene 的最佳方式是什么?

android - 使用 dlclose(Android NDK) 从应用程序中删除 native 库的实例

java - 将 C++ 项目导出到 Android - JNI/JavaCPP/Visualgdb