JNI – UnsatisfiedLinkError – loadLibrary总是失败

我试图让一个简单的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.(TranslatorWrapper.java:14) 

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

我也知道你用你load不同参数调用loadLibrary (特别是删除了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