java - JNI - UnsatisfiedLinkError - loadLibrary 总是失败

标签 java java-native-interface native

我试图让一个简单的 JNI 示例正常工作,但无论我做什么,我都无法使用 loadLibrary 命令让它正常工作。如果我指定 .so 文件的绝对路径并使用 System.load 而不是 System.loadLibrary,它会完美运行。

这是我的目录树:

.
|-- -
|-- TranslatorWrapper.c
|-- TranslatorWrapper.class
|-- TranslatorWrapper.cpp
|-- TranslatorWrapper.h
|-- TranslatorWrapper.java
`-- libTranslatorWrapper.so

Java代码如下:

public class TranslatorWrapper {

    public native String translate(byte[] bytes);

    public static void main(String[] args) {
        TranslatorWrapper w = new TranslatorWrapper();
        System.out.println("From JNI: " + w.translate(null));
    }
    static {
        System.out.println("Attempting to load library from " + System.getProperty("java.library.path"));
        System.loadLibrary("TranslatorWrapper");
        //System.load("/path/to/example/libTranslatorWrapper.so");
    }
}

我知道 .so 文件需要在 java.library.path 文件夹中,所以我用参数启动程序

java TranslatorWrapper -Djava.library.path=.

因为库与 .class 文件位于同一目录中。但是,似乎忽略了该值:

Attempting to load library from .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
Exception in thread "main" java.lang.UnsatisfiedLinkError: no TranslatorWrapper in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1754)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1045)
    at TranslatorWrapper.<clinit>(TranslatorWrapper.java:14)

请注意,我的命令行参数并未更改 java.library.path 变量。

我还知道您调用 loadLibrary 时使用了与load 不同的参数(特别是删除了 lib 前缀和 .so 后缀);正如您在代码中看到的那样,我已经在这样做了。不管 .so 文件在当前目录中,当前目录在 java.library.path 中,以及我以我在网上看到的方式调用 loadLibrary,这些都不起作用.

知道我做错了什么吗?

最佳答案

我会检查以下内容:

  1. 你确定java进程的当前目录和*.so文件一样吗?有时,包装器脚本可以改变这种情况?
  2. 是否使用 java TranslatorWrapper -Djava.library.path=/path/to/example TranslatorWrapper
  3. 如果您运行的是 Mac OS X,请参阅 http://developer.apple.com/java/faq/development.html#anchor4文件后缀应该是.jnilib(或.dylib)而不是.so
  4. 如果运行 Linux,您是否尝试过将 /path/to/example/ 附加到您的 LD_LIBRARY_PATH

关于java - JNI - UnsatisfiedLinkError - loadLibrary 总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3621158/

相关文章:

java - 如何将 Java ChangeListener 添加到方法返回

eclipse - 原生 Eclipse IDE?

java - 使用 Bridj 和 JNAerator 在 Java 中使用指针地址

android - 使用 Phonegap HTML5 在 Android 上调用 native 函数

java - Bson无法用Mongodb/Java解析

java - 如何比较 Java 中的两个日期,然后将结果与另一个日期进行比较?

Java JVM 分析,线程状态 - "Monitor"状态是什么意思?

java - 使用 cygwin 为 JNI (Android NDK) 编译 C++ 代码

java - 保留从 Android JNI 调用的 java 方法

java - 从 Java 存储中检索未知长度的字节数组