代码之家  ›  专栏  ›  技术社区  ›  I82Much

JNI-UnsatifiedLinkError-loadLibrary总是失败

  •  4
  • I82Much  · 技术社区  · 15 年前

    我试图让一个简单的JNI示例工作,但无论我做什么,我都无法使用loadLibrary命令让它工作。如果我指定.so文件的绝对路径并使用系统负荷而不是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");
        }
    }
    

    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)
    

    loadLibrary 你有不同的论点 load

    知道我做错了什么吗?

    1 回复  |  直到 15 年前
        1
  •  10
  •   gawi    15 年前

    我要检查一下:

    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/ 去你的图书馆