Java问题“UnsatisfiedLinkError”

我创建了一个简单的java程序,它将字节发送到并行端口,该端口使用.dll和另外两个类(pPort.java和ioPort.java)来完成它,并且它工作得很好。

但是,我开始在NetBeans IDE上创建另一个具有类似function的程序。 它编译得很完美,但是当我运行它时,我得到:

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

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

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

 PATH = %PATH%;C:\path_to_dll_file 

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

 setenv LD_LIBRARY_PATH mylibrarypath 

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

要在NetBeans上解决此问题,您可能需要查看来自Wade Chandler(NetBeans Dream团队成员)的此消息中提到的http://wiki.netbeans.org/DevFaqNativeLibraries 😉

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

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

我猜你在没有IDE的情况下运行你的程序,后者就是这种情况。 当你从NetBeans“work”目录运行它时很可能是netbeans/bin文件夹,所以无法找到DLL。 将其位置添加到路径,您应该很高兴。

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

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

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

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

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

问题解决了:

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