Проблема доступа к файлу dll из Java-программы через JNA

У меня есть файл DLL, и я пытаюсь вызвать его функции через программу Java через JNA

Но проблема в том, что он не может найти мой файл DLL и выбрасывает следующее исключение:

java.lang.UnsatisfiedLinkError: Unable to load library 'UsbDll': The specified module could not be found.

at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:199)
at com.sun.jna.Native.register(Native.java:1018)
at com.MainClass.<clinit>(MainClass.java:15)
Exception in thread "main"  

Ниже моя программа:

package com;

import com.sun.jna.Native

public class MainClass {

    static {
        Native.register("UsbDll");
    }

public native int method();

    public static void main(String[] args) {
    }
}

Имя моего DLL-файла - UsbDll.dll, а моя операционная система - Windows.

============================ РЕДАКТИРОВАНИЕ ===================== ===========

Расположение моего DLL-файла "c:\UsbDll.dll"

Когда я разместил другой файл DLL в том же месте, JNA обнаружил его, так что я думаю, что проблема только с моим файлом "UsbDll.dll".

Когда я попытался загрузить оба файла DLL (UsbDll.dll и другой DLL) с помощью следующей команды

System.load("c:\\UsbDll.dll");
System.load("c:\\another.dll");

Он успешно загрузил "another.dll", но для "UsbDll.dll" выдает следующее исключение:

java.lang.UnsatisfiedLinkError: C:\UsbDll.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1699)
at java.lang.Runtime.load0(Runtime.java:770)
at java.lang.System.load(System.java:1003)
at com.MainClass.<clinit>(MainClass.java:16)

Exception in thread "main" 

Q1. Похоже, что он не находит некоторые зависимые библиотеки. Но так как я совершенно новичок в этих библиотеках, есть ли что-то, что я пропускаю, или мне нужно попросить продавца предоставить мне зависимые библиотеки.

ИЛИ ЖЕ

Это зависит от некоторых стандартных библиотек, которые я могу скачать из Интернета? Если это так, то как найти имя библиотеки, от которой оно зависит?

============================ РЕДАКТИРОВАНИЕ № 2 =================== =============

Я запустил Dependency Walker для моего файла UsbDll.dll, чтобы найти отсутствующие зависимости и обнаружил следующие отсутствующие зависимости.

WER.DLL (упоминается библиотекой WINNM.DLL в моем c: \ windows \ system32)

IESHIMS.DLL (ссылается на библиотеку WINNM.DLL, найденную в моем c: \ windows \ system32)

WDAPI920.DLL (ссылается непосредственно на мой UsbDll.dll)

Q1. Поскольку WINNM.DLL был найден в моей папке system32, он выглядит как стандартная DLL. И если эта стандартная библиотека DLL ссылается на 2 отсутствующих библиотеки DLL (WER.DLL и IESHIMS.DLL), то я подозреваю, как работают другие приложения, использующие этот файл WINNM.DLL?

Q2. Я googled для WDAPI920.dll (который был направлен мой UsbDll.dll напрямую), и многие результаты поиска появились с тем же именем DLL. Так что это также выглядит как стандартная библиотека. Так как исправить эти зависимости? Откуда их скачать? После загрузки я могу поместить их в тот же каталог, в котором находится моя основная dll (UsbDll.dll), или мне нужно сделать что-то дополнительное, чтобы успешно загрузить мою dll (UsbDll.dll)?

2 ответа

Из вашего отредактированного кода совершенно очевидно, что UsbDll.dll зависит от некоторых стандартных модулей, которых нет в вашей системе (например, если он использует ATL и если у вас нет надлежащего времени выполнения, то он гарантированно потерпит неудачу). Для решения этой проблемы вам понадобится надлежащая среда выполнения.

Также возможно, что соответствующая dll зависит от модуля конкретного поставщика. Для вас лучшим вариантом является (и самый быстрый вариант будет) связаться с продавцом. В противном случае, попытайтесь установить правильное время выполнения с сайта Microsoft (но это скорее пробная версия)


Обновить

Используйте ссылки ниже, чтобы узнать больше о зависимости DLL:

  1. Как определить зависимости приложения.NET?
  2. http://msdn.microsoft.com/en-us/library/ms235265.aspx
  3. Инструмент командной строки для поиска зависимостей Dll


Обновление 2

Смотрите ниже ссылку на отсутствующие детали DLL (но это зависит от версии Windows)

  1. Зависимость Уокер сообщает, что IESHIMS.DLL и WER.DLL отсутствуют?
  2. http://social.msdn.microsoft.com/Forums/en/vsx/thread/6bb7dcaf-6385-4d24-b2c3-ce7e3547e68b

Из нескольких простых запросов Google, WDAPIXXX.dll кажется, что-то, связанное с победителем (хотя я не слишком уверен). Проверьте эту ссылку, им есть, что сказать о WDAPI http://www.jungo.com/st/support/tech_docs/td131.html.

DLL должна находиться в пути, указанном LD_LIBRARY_PATH (см. Ваш env), или, в случае JNA, в текущем каталоге.

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