JNA UnsatisfiedLinkError - работает, когда я устанавливаю в java.library.path фиктивное значение

Используя JNA 4.0.0, в Linux я пытаюсь загрузить нативную библиотеку (libmean.so), который находится в lib подкаталог (библиотека является просто тривиальным примером, который вычисляет среднее из двух чисел).

Я запускаю следующий код (в Eclipse), с -Djna.library.path=lib установить в конфигурации запуска.

import com.sun.jna.Library;
import com.sun.jna.Native;

public class Mean {
  public interface MeanLib extends Library {    
    MeanLib INSTANCE = (MeanLib) Native.loadLibrary("mean", MeanLib.class);
    double mean(double a, double b);
  }
  public static void main(String[] args) {          
    double result = MeanLib.INSTANCE.mean(1.0, 3.0);
    System.out.println(result);
  }
}

Но это терпит неудачу со следующим исключением:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't obtain updateLastError method for class com.sun.jna.Native
at com.sun.jna.Native.initIDs(Native Method)
at com.sun.jna.Native.<clinit>(Native.java:139)
at com.sun.jna.examples.Mean$MeanLib.<clinit>(Mean.java:64)
at com.sun.jna.examples.Mean.main(Mean.java:72)

Методом проб и ошибок я обнаружил, что код начинает работать, если я также установил java.library.path,

Тем не менее, он работает независимо от значения этого свойства. Например, я могу установить -Djava.library.path=xxxxxxx и это продолжает работать. Пустое значение также работает.

Что здесь происходит?

3 ответа

Решение

Основная проблема заключается в том, что в системе установлена ​​более старая версия JNA:

$ dpkg -l | grep -i jna
ii  libjna-java  3.2.7-4 Dynamic access of native libraries from Java without JNI

JNA запускается при попытке загрузить собственную библиотеку начальной загрузки. Он ищет это в разных местах, как описано в документации.

Проблема устранена с помощью -Djna.nosys=true флаг, который заставляет JNA загружать нативную библиотеку из вашего jna.jar, а не из системы.

Настройка java.library.path к бессмысленному значению имеет подобный побочный эффект - он переписывает нормальный java.library.pathпредотвращение загрузки системной версии JNA и откат к версии из вашего локального jna.jar,

Настройка отладки -Djna.debug_load=true также полезно для диагностики проблем JNA.

$ dpkg -l | grep -i jna

попробуйте эту команду, и если вы получаете этот вывод

ii  libjna-java  3.2.7-4 Dynamic access of native libraries from Java without JNI

или любой другой вывод, то вам нужно удалить этот jna из системы, потому что если у самой программы есть jna jar с этим, то для этого не требуется система jna. так что делай как то так

sudo apt-get autoremove libjna-java

и попробуйте перезапустить это приложение снова. он запустится и не будет запущен, затем попробуйте установить новую версию libwebkit-gtk.

надеюсь, это поможет. это помогло мне.

Я получил эту ошибку, когда я установил Netbeans 7 через apt-get, который загрузил libjna-java (3.2.7-4).

Поскольку Netbeans 7 старый, я установил версию 8 через установщик оболочки после удаления пакетов debian. Обязательно и автоматически удалите, чтобы избавиться от libjna.

Другие вопросы по тегам