Попытка использовать DLL из Java (JNA). Невозможно загрузить исключение библиотеки

У меня есть проект NetBeans из учебник, который вызывает исключение:

Исключение в потоке "main" java.lang.UnsatisfiedLinkError: Unable to load library 'simpleDLL': указанный модуль не найден.

Попробовал поместить simpleDLL.dll в библиотеки проектов, скопировал файл в папку system32 без успеха.

Ответ 1

У меня была точно такая же проблема с загрузкой DLL, я решил ее таким образом:

  • Как сказал Кристиан Куэтбах, проверьте, совместим ли простой DLL с вашей процессорной архитектурой, 32-разрядная DLL не будет работать на 64-разрядной машине, а также 64-разрядная DLL не будет работать 32-разрядная машина.
  • Если DLL совместима, проблема может быть в вашем пути к java-библиотеке. Я поместил свою DLL в каталог user.dir, а затем использовал этот код:

    Задайте путь библиотеки Java к user.dir или, возможно, другой путь, который вы хотите:

    String myLibraryPath = System.getProperty("user.dir");//or another absolute or relative path
    
    System.setProperty("java.library.path", myLibraryPath);
    

    Загрузите библиотеку:

    System.loadLibrary( "libraryWithoutDLLExtension" );

Это сработало для меня, попробуйте и скажите, работает ли оно для вас.

Ответ 2

Пожалуйста, проверьте, является ли simpleDLL 32 или 64 бит. Затем проверьте, если JVM также 32 или 64 бит. Они должны быть на той же платформе.

Вы также можете указать абсолютный путь, если вы измените loadLibrary() на load(): http://www.chilkatsoft.com/p/p_499.asp

Ответ 3

Я мог работать только в 32bit (Xp).

Поместите DLL в папку "c:\Windows\System32"

helloWorldDLL lib = (helloWorldDLL) Native.loadLibrary( "helloworldDLL", helloWorldDLL.class);

Если ошибка java.lang.UnsatisfiedLinkError: не удается загрузить библиотеку "сохраняется", используйте Dependency Walker для просмотра зависимых DLL.

Уклонение зависимостей

Ответ 4

Три возможных причины для этой проблемы, если файл dll не нарушен:

  1. Совместимость 32 бит 64 бит. 32-разрядная dll может работать только на 32-битном jdk или jre. Используя командный file <filename> Cygwin file <filename> мы можем определить, является ли dll 32-разрядной или 64-битной.

  2. dll не привязана к правильному пути, поэтому java не может найти его. Вообще говоря, мы можем использовать некоторый абсолютный путь, отличный от System32 чтобы гарантировать правильность пути.

  3. DLL, которую мы загружаем, требует других DLL.

Как мы можем справиться с третьей возможностью:

  1. с помощью JNI System.loadLibrary() mthod может дать мне больше намека, по сравнению с JNA. Он может сказать что-то вроде: Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries. Это означает, что некоторые библиотеки MyLibrary.dll зависят от того, отсутствует. Используя зависимый ходок, мы можем определить, какие DLL необходимы.

  2. Загружая эти DLL перед DLL, которые мы хотим загрузить, мы можем решить эту проблему.