У меня есть файл 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)?