我想在我的项目中使用这个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)
答案 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();
}
}
}