2010-09-16 16 views
6

Potrzebuję pomocy w obsłużeniu następującego scenariusza.Biblioteka macierzysta już załadowana do innego programu ładującego klasy

Używam dwóch apletów, które wymagają tego samego pliku biblioteki rodzimej (.dll).

Kiedy uruchamiam aplety ze stron internetowych, po raz pierwszy pierwszy aplet ładuje bibliotekę DLL do programu ładującego klasy apletów. To działa dobrze. Ale gdy drugi aplet próbuje załadować tę samą bibliotekę dll, daje mi wyjątek mówiąc, że "Error loading win32com: java.lang.UnsatisfiedLinkError: Native Library C:\WINDOWS\system32\win32com.dll already loaded in another classloader"

Korzystam z następującej metody, aby załadować sterownik.

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

Proszę dać mi rozwiązanie

Thanks & Rgds, Rishikesh

+2

Rozwiązanie jest podane tutaj http://stackoverflow.com/questions/1139386/check-if-a-dll-library-is-already-loaded-java/1139433#1139433 i tam http://stackoverflow.com/questions/1030792/dll-already-loaded-in-in-classloader –

Odpowiedz

0

W skrócie, samąinstancji klasy, która wykorzystuje natywne biblioteki muszą być wspólne dla obu klas .

Można to zrobić, pobierając program ładujący klasy systemu (lub nadrzędny element nadrzędny programu ładującego klasy z bieżącej klasy), a następnie dynamicznie ładując klasę, która korzysta z biblioteki natywnej.

Jeśli nie wiesz, która klasa ładuje bibliotekę macierzystą, możesz utworzyć klasę proxy i załadować tę isntead. Klasa musi wywołać dla Ciebie inne biblioteki, aby były one ładowane za pomocą klasy klasy klas Proxy (i tak również będą udostępniane).

Jednak spodziewałbym się, że menedżer bezpieczeństwa uniemożliwi ci to w aplecie.

+1

Witam Dziękuję za szybką pomoc. Użyłem System.loadLibrary ("win32com"); ale otrzymuję następujące wyjątek: javax.comm.NoSuchPortException na javax.comm.CommPortIdentifier.getPortIdentifier (CommPortIdentifier.java:105) Dlatego ładuję sterownik przy użyciu sterownika CommDriver = (CommDriver) Class.forName ("com.sun. comm.Win32Driver "). newInstance(); driver.initialize(); Czy jest jakiś przykład kodu, w którym mogę odsyłać rzeczy z biblioteki współdzielonej? – Rishikesh

0

Nie ma sensu ładowanie Biblioteki Natywnej (w zasadzie żadnej biblioteki) dwa razy w różnych lokalizacjach. Można wykonać obiekt Applet1: * sterownik * jako static.
I używać go w Applet2.