JNI - UnsatisfiedLinkError - loadLibrary всегда терпит неудачу - PullRequest
4 голосов
/ 01 сентября 2010

Я пытаюсь заставить работать простой пример 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 так, как я видел, он сказал онлайн, ничего из этого не работает.

Есть идеи, что я делаю не так?

1 Ответ

10 голосов
/ 02 сентября 2010

Я бы проверил следующее:

  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
...