1

我正在通过 Java Applet 和 rxtx 库进行一些串行通信。小程序工作正常,但是当我遇到问题时加载更多

UnsatisfiedLinkError: rxtxSerial.dll 已经加载到另一个类加载器中

如何从 java JVM 中卸载库(DLL)之后,我正在尝试卸载 dll,我相信这可以帮助解决这个问题。

据我了解,我可以为 rxtx 类自定义类加载器,并强制垃圾收集器在某些时候清理所有内容,包括加载的 dll。

所以下面的代码应该会有所帮助(我试图将它加载到负责启动与串口通信的函数中)。

cl = new CustomClassLoader();
ca = cl.findClass("gnu.io.CommPortIdentifier");
a = ca.newInstance();
p = ca.getMethod("getPortIdentifier");
portId = (CommPortIdentifier) p.invoke(a, comportUsed);

不幸的是它抛出ClassNotFoundException

我猜我的自定义类加载器有问题,但不知道是什么。

请帮助我找到那个或克服的方法UnsatisfiedLinkError

4

1 回答 1

0

前段时间我不得不在运行时卸载一个有缺陷的 DLL。不幸的是,没有可靠的解决方案。即使您使用自定义类加载器,某些操作系统(如 Windows Vista)也会在 DLL 卸载时杀死 VM。最后我不得不用我自己的驱动程序替换 DLL。你可以查看我们之前的讨论

https://forums.oracle.com/forums/thread.jspa?threadID=1546756&tstart=1185

可能您将不得不修改您的设计以避免多次加载 DLL。一个小型的专用 Java 服务器/应用程序就可以完成这项工作

于 2013-01-07T13:39:54.830 回答