繁体   English   中英

找不到JNA运行时相关的库

[英]JNA runtime dependent library not found

我正在尝试在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);

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(确定),并且正确枚举了设备。 摘自JNI代码:

int nbMp = 0;
char devlist[512];
char *pList = devlist;
WORD ret = USBEnumerateDevices(&nbMp, &pList);  

使用依赖关系遍历器,我看不到任何明显丢失的依赖关系,此外,MPDeviceDriver.dll未列为依赖关系。 我猜它是由代码本身手动加载的。

我很肯定在JNA中调用USBEnumerateDevices的方法是正确的,因为当我用一个非常旧的版本(一个不依赖于MPDeviceDriver.dll的版本)替换MP300Com.dll时,该设备将被正确枚举。 pSerialList包含我的设备字符串)

链接到手册中的功能定义

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

  • 如果第一次加载DLL的线程与第一次使用DLL的线程相同,则DLL在所有线程中均有效
  • 如果第一次加载DLL的线程与首次使用DLL的线程不同 ,则这些线程均不能使用DLL,但是从另一个ThreadGroup产生的另一个线程可以使用DLL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM