2010-09-01 59 views
4

我试图得到一个简单的JNI示例工作,但无论我做什么,我都无法使用loadLibrary命令使其工作。如果我指定.so文件的绝对路径并使用System.load而不是System.loadLibrary,则它可以很好地工作。JNI - UnsatisfiedLinkError - 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,这些都不起作用。

任何想法我做错了什么?

回答

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

* sma头*。答案是#3;将.so后缀改为.dylib可以完美工作。 谢谢。 – I82Much 2010-09-01 20:44:05

+1

而且我还没有碰到Mac多年! – gawi 2010-09-01 20:46:58

+0

我一直在挣扎一个小时,试图弄清楚我做错了什么。它是#3。感谢你! – 2014-05-12 15:54:34