本地库已在另一个类加载器中加载

6
我需要帮助处理以下情况。
我正在使用两个小程序,它们都需要相同的本地库(.dll)文件。
所以当我从网页运行小程序时,第一个小程序将dll加载到小程序类加载器中。这很好用。 但是当第二个小程序尝试加载相同的dll时,它会给我一个异常,说“Error loading win32com: java.lang.UnsatisfiedLinkError: Native Library C:\WINDOWS\system32\win32com.dll already loaded in another classloader”。
我使用以下方法来加载驱动程序。
CommDriver driver = (CommDriver)Class.forName("com.sun.comm.Win32Driver").newInstance();
driver.initialize();

请给我提供解决方案

谢谢 & 祝好, Rishikesh


2
解决方案在这里提供:https://dev59.com/UHM_5IYBdhLWcg3w-4nw#1139433 和这里:https://dev59.com/QnNA5IYBdhLWcg3wQ7i4 - dma_k
2个回答

0
简而言之,使用本地库的类的相同实例必须由两个类共享。
您可以通过获取系统类加载器(或当前类的类加载器的顶级父级)并动态加载使用本地库的类来实现此目的。
如果您不知道哪个类会加载本地库,则可以创建代理类并加载该类。该类必须为您调用其他库,以便它们将使用代理类的类加载器进行加载(因此也将被共享)。
但是,我预计安全管理器将防止您在Applet中执行此操作。

1
你好,感谢你的快速协助。我用了 System.loadLibrary("win32com"); 但是我遇到了如下异常:javax.comm.NoSuchPortException at javax.comm.CommPortIdentifier.getPortIdentifier(CommPortIdentifier.java:105) 所以我使用以下代码加载驱动程序: CommDriver driver = (CommDriver)Class.forName("com.sun.comm.Win32Driver").newInstance(); driver.initialize(); 请问是否有可以参考的共享库示例代码? - Rishikesh

0

在不同的位置加载本地库(实际上是任何库)两次没有意义。 你可以将Applet1的*驱动程序*对象设置为静态。 然后在Applet2中使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接