2

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

导入后,我可以看到 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 位下运行。

4

1 回答 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这可能表明库已正确加载。

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

编辑:调整 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();
    }
  }
}
于 2012-08-22T22:01:00.117 回答