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

时间:2012-08-22 17:33:57

标签: java c++ dll java-native-interface usb

我想在我的项目中使用这个JAR文件(http://sourceforge.net/projects/uirt-j/)。在Eclipse中我使用了选项Project> Java构建路径>添加外部JAR以导入它。我可以在Ecplise中看到所有类的JAR文件。这个JAR包含两个dll文件。为了加载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都在System32文件夹中。我的代码:

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

1 个答案:

答案 0 :(得分: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这可能表明库已正确加载。

File System Redirector文章可能会对SysWOW64 vs 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();
    }
  }
}