1

我制作了一个简单的 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 中指定某些内容才能使其正常工作?对此的任何帮助将不胜感激。

4

5 回答 5

3

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

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

于 2009-11-07T19:48:43.770 回答
3

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

-Djava.library.path="c:/path/to/dll/files"
于 2009-11-07T19:48:56.387 回答
1

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

于 2009-11-07T19:47:55.250 回答
1

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

PATH = %PATH%;C:\path_to_dll_file 

在 UNIX 平台上,您应该使用扩展库路径

setenv LD_LIBRARY_PATH mylibrarypath 

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

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

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

于 2009-11-07T21:30:19.477 回答
0

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

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

问题通过以下方式解决:

  1. 向 Netbeans 添加 32 位 Java 平台(菜单:工具/Java 平台)和
  2. 将其指定为项目的平台(项目属性/库/Java 平台)。
于 2012-09-03T16:39:16.377 回答