Java:util_USBUIRT.dll:找不到依赖库
我想在我的项目中使用这个JAR文件( http://sourceforge.net/projects/uirt-j/ )。 在Eclipse中,我使用了选项Project> Java Build Path> Add External JARs来导入它。 我可以在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.(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 7×64)
上面提到的jar中的dll是32位。 环境是Win7 x64。 我假设JVM是32位,否则会出现另一个错误,即: Can't load IA 32-bit .dll on a AMD 64-bit platform
或类似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
,虽然我得到了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(); } } }