JNI - UnsatisfiedLinkError - loadLibrary 总是失败

4

我试图运行一个简单的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个回答

10
我会检查以下内容:
  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 中

3
“拍了拍头”。答案是第三个,将“.so”后缀改为“.dylib”完美解决问题。谢谢。 - I82Much
1
我已经好几年没有碰过Mac了! - gawi
我已经苦苦挣扎了一个小时,试图弄清楚我做错了什么。原来是第三步。谢谢你! - Jagtesh Chadha
对我来说,是将loadLibrary()字符串中的“lib”前缀删除。 - kainjow
使用.so文件有什么问题吗?我从来没有听说过anchor4。这似乎有点荒谬。 - IgorGanapolsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接