Java:util_USBUIRT.dll:找不到依赖库

问题描述 投票:0回答:1

我想在个人项目中使用这个 jar 文件(http://sourceforge.net/projects/uirt-j/)。目前,我一直在使用 Eclipse 并尝试导入该 jar(Project > Java Build Path > Add external JARs)。

导入后,我可以看到 Eclipse 中列出的该包中的所有类,但是,该 jar 还包含两个与设备通信所需的 win32 dll 文件。我尝试将它们添加到 System32 目录,但没有成功。当我运行这个项目时,它抛出以下异常:

    Exception in thread "main" java.lang.UnsatisfiedLinkError:
    C:\Windows\System32\util_USBUIRT.dll: Can't find dependent libraries
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.loadLibrary0(Unknown Source)
    at java.lang.System.loadLibrary(Unknown Source)
    at util.USBUIRT.<clinit>(USBUIRT.java:269)
    at Uirt.main(Uirt.java:6)

使用dependence walker,我可以看到所有的dll都正确链接并且可以导入。

代码片段:

    import util.USBUIRT;
    public class Uirt {
    public static void main(String[] args) {
        String code = "0000";   
        try {
            USBUIRT.transmitIR(code, 2, 3, 2);
        } catch (Exception e) {
            e.printStackTrace();
        }
      }
    }

如果该 JAR 文件独立执行,则它可以正常工作。我当前的设置在 Windows 7 64 位下运行。

java c++ dll java-native-interface usb
1个回答
4
投票

上述 jar 中的 dll 是 32 位的。环境是Win7 x64。我假设 JVM 是 32 位的,否则会出现另一个错误,即:

Can't load IA 32-bit .dll on a AMD 64-bit platform
或类似的错误。

尝试将 dll 复制到

C:\Windows\SysWOW64
而不是
C:\Windows\System32
。 32 位 dll 应进入
C:\Windows\SysWOW64
。它对我有用,尽管我得到了
util.USBUIRT$NotInitializedException
,这可能表明库已正确加载。

文件系统重定向器文章可能会阐明

SysWOW64
System32

编辑:调整 java.library.path

您也可以采用评论中提到的解决方案,例如,将 dll 复制到

C:\tmp
并使用参数运行:

-Djava.library.path="C:\tmp;${env_var:PATH}"

但是由于两个 dll 之间存在依赖关系,因此

C:\tmp
必须位于
PATH
上。不然还有
UnsatisfiedLinkError
。手动加载
uuirtdrv.dll
应该会有帮助,即:

import util.USBUIRT;
public class Uirt {
    static {
        System.loadLibrary("uuirtdrv");
    }

public static void main(String[] args) {
    String code = "0000";   
    try {
        USBUIRT.transmitIR(code, 2, 3, 2);
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.