Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未找到JNA运行时相关库_Java_Jna - Fatal编程技术网

Java 未找到JNA运行时相关库

Java 未找到JNA运行时相关库,java,jna,Java,Jna,我试图在JNA中使用预先存在的stdcall DLL,其中一个函数不断抱怨找不到依赖运行时的DLL。在一个相当于JNI的版本中,我没有收到这种抱怨,它按预期工作 System.loadLibrary("MP300Com"); Map<String, Object> functionMapper = new HashMap<>(); functionMapper.put( Library.OPTION_FUNCTION_MAPPER, n

我试图在JNA中使用预先存在的stdcall DLL,其中一个函数不断抱怨找不到依赖运行时的DLL。在一个相当于JNI的版本中,我没有收到这种抱怨,它按预期工作

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);

当我调用函数
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时,设备被正确枚举。(pSerialist
包含设备字符串)


在一位同事尝试了一些简化的测试之后,它突然起了作用,而在我尝试将调用的确切顺序转换到框架中之后,它再次不起作用。事实证明,这个特定的DLL是线程敏感的,并且以最扭曲的方式:

  • 如果加载DLL的线程与第一次使用DLL的线程相同,则DLL在所有线程中都有效
  • 如果加载DLL的线程与第一次使用DLL的线程不同,则这些线程都不能使用DLL,但从另一个线程组派生的另一个线程可以使用DLL
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;
}
int nbMp = 0;
char devlist[512];
char *pList = devlist;
WORD ret = USBEnumerateDevices(&nbMp, &pList);