我想在JNA中使用預先存在的stdcall DLL,並且其中一個函數一直在抱怨找不到與運行時相關的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文件是我的與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);
隨着Dependency Walker中,我沒有看到任何明顯缺少的依賴關係,而且,MPDeviceDriver.dll沒有被列爲依賴關係。我猜它是由代碼本身手動加載的。
我很積極在JNA中調用USBEnumerateDevices
的方式是正確的,因爲當我用一個非常舊的版本(不依賴於MPDeviceDriver.dll的版本)替換MP300Com.dll時,設備會正確枚舉。 (該pSerialList
包含我的設備字符串)
Link to the function definition in the manual