Java 问题“UnsatisfiedLinkError”

Posted

技术标签:

【中文标题】Java 问题“UnsatisfiedLinkError”【英文标题】:Java Problem "UnsatisfiedLinkError" 【发布时间】:2010-12-14 05:30:29 【问题描述】:

我制作了一个简单的 java 程序,将字节发送到并行端口,它使用一个 .dll 和其他两个类(pPort.java 和 ioPort.java)来完成它,它工作得非常好。

但是,我开始在 NetBeans IDE 上制作另一个具有类似功能的程序。它编译得很好,但是当我运行它时,我得到:

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: parallelporttimer.ioPort.Out32(SS)V

据我了解,它无法调用我放在 System32 上的 .dll 文件。但我不明白为什么,因为另一个程序基本相同,但没有任何 IDE 手动制作,运行良好。我是否必须在 NetBeans 中指定某些内容才能使其正常工作?对此的任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您是否查看过这两个程序(独立程序和 IDE)的两个类路径?

【讨论】:

【参考方案2】:

DLL 需要位于路径或当前工作目录中才能加载。

我猜当您在没有 IDE 的情况下运行程序时是后者。当您从 NetBeans 中运行它时,“工作”目录可能是 netbeans/bin 文件夹,因此无法找到 DLL。将其位置添加到路径中,您应该可以开始了。

【讨论】:

【参考方案3】:

我不使用 Netbeans,但听起来 Netbeans 维护自己的 java.library.path。您可以尝试的最好的方法是自己将其指定为 VM 参数:

-Djava.library.path="c:/path/to/dll/files"

【讨论】:

【参考方案4】:

UnsatisfiedLinkError 消息通常表示已设置库路径,但不包括您尝试加载的库。在 Windows 平台上,您应该使用

扩展PATH
PATH = %PATH%;C:\path_to_dll_file 

在 UNIX 平台上,您应该使用

扩展库路径
setenv LD_LIBRARY_PATH mylibrarypath 

但是,据我所知(我不在 Windows 下),System32PATH 中,所以我怀疑 NetBeans 会通过设置自己的 PATH 来覆盖它。

要在 NetBeans 上解决此问题,您可能需要查看 this message 中提到的 http://wiki.netbeans.org/DevFaqNativeLibraries,来自 NetBeans 梦之队成员 Wade Chandler ;-)

PS:您也可以使用java.library.path 系统属性,但请记住,此系统属性仅适用于解析您在代码中加载的直接本机库。其他依赖库的加载留给第一个库。您加载的 JNI 库将依赖于操作系统相关的方式来解析其引用(这也适用于 IMO 的常见问题解答的解决方案,所以我仍然不能 100% 相信它是一个好的解决方案)。

【讨论】:

【参考方案5】:

在我的情况下,原因不是缺少库,而是使用 64 位 Java JDK 作为 Netbeans 的默认 Java 平台。

(添加“-d32”标志没有帮助。)

问题已通过以下方式解决:

    将 32 位 Java 平台添加到 Netbeans(菜单:工具/Java 平台)和 将其指定为项目的平台(项目属性/库/Java 平台)。

【讨论】:

以上是关于Java 问题“UnsatisfiedLinkError”的主要内容,如果未能解决你的问题,请参考以下文章

Java 问题

Java TimerTask问题

java问题

java 小问题

java问题

java实现日期排序问题