2010-09-16 102 views
6

我需要一些幫助來處理以下情形。本地庫已經加載到另一個類加載器中

我正在使用兩個需要相同本機庫(.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(); 

請給我解決

感謝& RGDS, 瑞詩凱詩

+2

解決方案在這裏給出http://stackoverflow.com/questions/1139386/check-if-a-dll-library-is-already-loaded-java/1139433#1139433和那裏http://stackoverflow.com/questions/1030792/dll-already-loaded-in-another-classloader – 2011-05-30 15:43:01

回答

0

總之,相同實例使用本機庫必須由兩個類共享類的

您可以通過獲取系統類加載器(或當前類的類加載器的頂級父對象)來完成此操作,然後動態加載使用本地庫的類。

如果您不知道哪個類會加載本機庫,那麼您可以創建代理類並加載它。該類必須爲您調用其他庫,以便它們將加載Proxy類classloader(因此也可以共享)。

但是我希望安全管理器阻止你在Applet中執行此操作。

+1

嗨,感謝您的快速幫助。我使用System.loadLibrary(「win32com」);但我得到的follwing exeption:javax.comm.NoSuchPortException at javax.comm.CommPortIdentifier.getPortIdentifier(CommPortIdentifier.java:105)因此我加載驅動程序使用CommDriver驅動程序=(CommDriver)Class.forName(「com.sun。 comm.Win32Driver「)的newInstance(); driver.initialize(); 有沒有我可以參考共享庫的東西的代碼的任何例子? – Rishikesh 2010-09-16 13:13:23

0

在本地庫(實際上是任何庫)兩次加載不同位置沒有意義。 您可以製作Applet1's * 驅動程序 * object as static
並在Applet2中使用它。

相關問題