我试图运行一个简单的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,在这些情况下都无法运行。你有什么想法吗?
.so
文件有什么问题吗?我从来没有听说过anchor4。这似乎有点荒谬。 - IgorGanapolsky