【问题标题】:Having issues unloading rxtxSerial.dll卸载 rxtxSerial.dll 时遇到问题
【发布时间】:2013-01-07 12:39:47
【问题描述】:

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

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

How to unload library (DLL) from java JVM 之后,我正在尝试卸载 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

【问题讨论】:

    标签: java dll rxtx


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。我不知道要修改我的代码。我只加载一次 rxrtxSerial dll ......在小程序中。通过这个小程序,我在财务打印机上打印了一些工资单。我可以打印很多次,而且效果很好。但是,我使用相同的小程序(带有一些不同的参数)来发送不同的命令(如 printDailyreport)。如果我在打印一些工资单后尝试打印每日报告,则会发生崩溃……反之亦然,如果我从打印每日报告开始,我将不再能够打印工资单。奇怪,但所有这些都会导致 UnsatisfiedLinkError。
    • 我看到了 2 个可能的解决方案:在小程序之间共享相同的 ClassLoader(认为 URL 必须相同)或确保没有串行端口功能的模块(如 printDailyreport)不加载 DLL。
    • 您能建议如何在applet 之间共享同一个ClassLoader 吗?我的小程序具有相同的 url、代码库,所有内容。唯一不同的是,当我做日报时,小程序的action参数设置为“dailyReport”......我唯一能想到的就是以不同的方式传递action(其他数据是base64封装的) json 编码表...我从 PHP 发送此数据)。每日报告是财务打印机的一些功能 - 您将命令(通过串行)发送到打印机并打印报告。
    • 你可以试试jssc。 (与 RxTx 相比,它已经显示出足够稳定,可以在生产环境中使用)
    • 谢谢,我正在考虑切换到 jssc。不幸的是,当我开始编写串行端口小程序时没有找到该项目,现在对我来说进行更改有点棘手。此外,我还有另一个项目,我必须将 applet 和 JNA 与其他一些 dll 一起使用……在第二个项目中也存在类似的问题。这就是我感兴趣的解决问题的方式,而不是通过替换库......但无论如何 jssc 可能是我的下一步行动。
    猜你喜欢
    • 2012-03-31
    • 2012-04-06
    • 2021-09-24
    • 2018-05-27
    • 2023-04-08
    • 2019-01-11
    • 1970-01-01
    • 2021-11-06
    • 2018-07-24
    相关资源
    最近更新 更多