我试图让一个简单的 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,这些都不起作用.
知道我做错了什么吗?
最佳答案
我会检查以下内容:
- 你确定java进程的当前目录和*.so文件一样吗?有时,包装器脚本可以改变这种情况?
- 是否使用
java TranslatorWrapper -Djava.library.path=/path/to/example TranslatorWrapper
- 如果您运行的是 Mac OS X,请参阅 http://developer.apple.com/java/faq/development.html#anchor4文件后缀应该是.jnilib(或.dylib)而不是.so
- 如果运行 Linux,您是否尝试过将
/path/to/example/
附加到您的 LD_LIBRARY_PATH
关于java - JNI - UnsatisfiedLinkError - loadLibrary 总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3621158/