Проблема доступа к файлу DLL из Java-программы через JNA - PullRequest
5 голосов
/ 26 января 2011

У меня есть файл 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. Похоже, что он не находит некоторые зависимые библиотеки. Но так как я совершенно новичок в этих библиотеках, есть ли что-то, что я пропускаю, или мне нужно попросить продавца предоставить мне зависимые библиотеки.

OR

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

============================ ИЗД. № 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 ]

1 голос
/ 26 января 2011

Из вашего отредактированного кода совершенно очевидно, что 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, похоже, связано с некоторыми драйверами win (хотя я не слишком уверен).Проверьте эту ссылку, им есть что сказать о WDAPI http://www.jungo.com/st/support/tech_docs/td131.html.

0 голосов
/ 26 января 2011

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

...