2010-09-16 7 views
6

J'ai besoin d'aide pour gérer le scénario suivant.Bibliothèque native déjà chargée dans un autre chargeur de classe

J'utilise deux applets qui nécessitent le même fichier de bibliothèque native (.dll).

Ainsi, lorsque je lance les applets à partir des pages Web, la première applet charge pour la première fois la DLL dans le chargeur de classe d'applet. Ça fonctionne bien. Mais lorsque la deuxième applet essaie de charger la même DLL, elle me donne l'exception en disant que "Error loading win32com: java.lang.UnsatisfiedLinkError: Native Library C:\WINDOWS\system32\win32com.dll already loaded in another classloader"

J'ai utilisé la méthode suivante pour charger le pilote.

CommDriver driver = (CommDriver)Class.forName("com.sun.comm.Win32Driver").newInstance(); 
driver.initialize(); 

S'il vous plaît me donner la solution

Merci & Mfg, Rishikesh

+2

La solution est donnée ici http://stackoverflow.com/questions/1139386/check-if-a-dll-library-is-already-loaded-java/1139433#1139433 et là http://stackoverflow.com/questions/1030792/dll-déjà-chargé-dans-autre-classloader –

Répondre

0

En bref, le mêmeexemple de la classe qui utilise la bibliothèque native doit être partagée par les deux classes .

Vous pouvez le faire en obtenant le chargeur de classe système (ou le parent supérieur du chargeur de classe de votre classe actuelle), puis dynamiquement charger la classe qui utilise la bibliothèque native.

Si vous ne savez pas quelle classe charge la bibliothèque native, vous pouvez créer une classe proxy et charger cette variable isntead. La classe doit appeler les autres bibliothèques pour vous afin qu'elles soient chargées avec le classloader des classes Proxy (et ainsi être partagées).

Cependant, je m'attendrais à ce que le gestionnaire de sécurité vous empêche de le faire dans une applet.

+1

Salut Merci pour votre aide rapide.J'ai utilisé System.loadLibrary ("win32com"); mais je reçois l'exeption follwing: javax.comm.NoSuchPortException à javax.comm.CommPortIdentifier.getPortIdentifier (CommPortIdentifier.java:105) Par conséquent je charge le conducteur en utilisant CommDriver driver = (CommDriver) Class.forName ("com.sun. comm.Win32Driver "). newInstance(); pilote.initialize(); Existe-t-il un exemple de code dans lequel je peux référencer des éléments de bibliothèque partagés? – Rishikesh

0

Il est inutile de charger la bibliothèque native (en fait n'importe quelle bibliothèque) deux fois dans des emplacements différents. Vous pouvez faire Applet1 * pilote * objet comme statique.
Et l'utiliser dans Applet2.

Questions connexes