我想在个人项目中使用这个 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 位下运行。
上述 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();
}
}
}