Я пытаюсь использовать ранее существовавшую DLL-файл stdcall в JNA, и одна из функций продолжает жаловаться на невозможность найти зависящую от времени выполнения dll. В эквивалентной версии JNI я не получаю эту жалобу, и она работает так, как ожидалось.JNA-зависимая библиотека не найдена
System.loadLibrary("MP300Com");
Map<String, Object> functionMapper = new HashMap<>();
functionMapper.put(
Library.OPTION_FUNCTION_MAPPER,
new StdCallFunctionMapper());
library = (Mp300Library)Native.loadLibrary(
"MP300Com",
Mp300Library.class,
functionMapper);
public interface Mp300Library extends StdCallLibrary {
int USBEnumerateDevices(IntByReference pNbMP300, Pointer ppSerialList);
}
public static String[] USBEnumerateDevices() throws Mp300Exception {
Memory pSerialList = new Memory(512);
IntByReference pNbMP300 = new IntByReference();
Pointer ppSerialList = new Memory(Pointer.SIZE);
ppSerialList.setPointer(0, pSerialList);
int status = library.USBEnumerateDevices(pNbMP300, ppSerialList);
System.out.println(status); // 65525 = 0xfff5
return null;
}
Когда я вызываю функцию USBEnumerateDevices
я получаю возвращаемое значение 0xFFF5, которое в соответствии с инструкцией означает "не MPDeviceDriver.dll нашли"
Файл MPDeviceDriver.dll - это i n тот же путь, что и MP300Com.dll, и оба они также находятся в c: \ windows \ sysWOW64
Я также попытался добавить System.loadLibrary("MPDeviceDriver");
до и после другой загрузки, без успеха. Я могу проверить, что он загружается - по JNA, потому что я не могу удалить файл MPDeviceDriver.dll в папке проекта (он заблокирован).
Как говорилось ранее, когда версия JNI вызывает эту функцию, я получаю возвращаемое значение 0x0 (ok), и устройства перечислены правильно. Выдержка из кода JNI:
int nbMp = 0;
char devlist[512];
char *pList = devlist;
WORD ret = USBEnumerateDevices(&nbMp, &pList);
С зависимости ходок, я не вижу каких-либо явно отсутствующие зависимости, и, кроме того, MPDeviceDriver.dll нет в списке, как зависимость. Я предполагаю, что он загружается вручную, по самому коду.
Я уверен, что способ вызова USBEnumerateDevices
в JNA правильный, потому что, когда я заменяю MP300Com.dll на очень старую версию (не зависящую от MPDeviceDriver.dll), устройство получает нумерацию правильно. (pSerialList
содержит мою строку устройства)
Link to the function definition in the manual