本机库已加载到另一个类加载器中
我需要一些帮助来处理以下情况。
我正在使用两个需要相同本机库 (.dll) 文件的小程序。
因此,当我从网页运行小程序时,第一个小程序第一次将 dll 加载到小程序类加载器中。效果很好。 但是,当第二个小程序尝试加载相同的 dll 时,它给出了异常:“加载 win32com 时出错:java.lang.UnsatisfiedLinkError:本机库 C:\WINDOWS\system32\win32com.dll 已在另一个类加载器中加载”
我使用以下方法来加载驱动程序。
CommDriver driver = (CommDriver)Class.forName("com.sun.comm.Win32Driver").newInstance();
driver.initialize();
请给我解决方案
谢谢&平均值, 瑞诗凯诗
I need some help to handle following scenario.
I am using two applets which requires the same native library (.dll) file.
So when I run the applets from the web pages, for the first time first applet loads the dll into the applet class loader. It works fine.
But when second applet tries to load the same dll it gives me exception saying that "Error loading win32com: java.lang.UnsatisfiedLinkError: Native Library C:\WINDOWS\system32\win32com.dll already loaded in another classloader"
I using following method to load the driver.
CommDriver driver = (CommDriver)Class.forName("com.sun.comm.Win32Driver").newInstance();
driver.initialize();
Please give me the solution
Thanks & Rgds,
Rishikesh
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
简而言之,使用本机库的类的相同实例必须由两个类共享。
您可以通过获取系统类加载器(或当前类的类加载器的顶级父级)来完成此操作,然后动态地让它加载使用本机库的类。
如果您不知道哪个类加载本机库,那么您可以创建一个代理类并加载它。该类必须为您调用其他库,以便它们将使用代理类类加载器加载(因此也可以共享)。
不过,我希望安全管理器能够阻止您在 Applet 中执行此操作。
In short, the same instance of the class that uses the native library must be shared by both classes.
You can do this by getting the system class loader (or the top parent of the class loader of your current class) and then dynamically have it load the class which uses the native library.
If you don't know which class does load the native library then you can make a proxy class and load this isntead. The class must call to the other libraries for you so they will be loaded with the Proxy classes classloader (and so also be shared).
However I would expect the security manager to prevent you from doing this within an Applet.
在不同位置加载本机库(事实上任何库)两次是没有意义的。
您可以将Applet1的*驱动程序*对象设置为静态。
并在Applet2中使用它。
There is no point in loading the Native Library(as a matter of fact any library)twice in different locations.
You can make Applet1's *driver* object as static.
And use it in Applet2.