【问题标题】:Java: util_USBUIRT.dll: Can't find dependent librariesJava:util_USBUIRT.dll:找不到依赖库
【发布时间】:2012-08-18 04:35:39
【问题描述】:

我想在个人项目中使用这个 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都正确链接可以导入。

这是我要运行的代码 sn-p:

    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】:

上述 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 的文章可能会对SysWOW64System32 有所区别。

编辑:调整 java.library.path

你也可以使用 cmets 中提到的解决方案,例如,将 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();
    }
  }
}

【讨论】:

  • 非常感谢。我的 JRE 是 x64。我安装了 32 位版本并且可以工作!谢谢!
  • @JonathanSimonPrates 很高兴它对您有所帮助! :)
  • 你救了我! JVM 是 32,但 Windows 是 64,所以我必须将 jmtp.dll 放在 C:\Windows\SysWOW64 上才能工作。
  • @Bagata 即使属性已更新,加载程序也只会在启动时检查该属性一次。有关详细信息,请参阅this 线程。
  • @Aqua 我去看看。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 2013-06-20
  • 2015-08-21
  • 2019-08-05
  • 2014-08-26
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多