Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

sprawdzanie zaladowania biblioteki zewnetrznej

2 views
Skip to first unread message

Joshua Robin

unread,
Feb 1, 2006, 2:25:43 PM2/1/06
to
jeszcze raz ja :)

w jaki sposob sprawdzic mozna czy dana biblioteka zewnetrzna
zostala juz zaladowana za pomoca System.loadLibrary() ??
w klasie system nie widac takiej metody.

pozdrawiam,
--
Jakub Wiśniewski / Joshua Robin -> http://jrobin.net

od myśli i słów do czynów jest bardzo, bardzo daleka droga

Brzezi

unread,
Feb 1, 2006, 3:27:33 PM2/1/06
to
śro, 01 lut 2006 o 20:25 GMT, Joshua Robin napisał(a):

> jeszcze raz ja :)
>
> w jaki sposob sprawdzic mozna czy dana biblioteka zewnetrzna
> zostala juz zaladowana za pomoca System.loadLibrary() ??
> w klasie system nie widac takiej metody.

nie wiem czy da sie tak poprostu sprawdzic...

ale najprostrzym sposobem to chyba sprobowanie wykonania jakiejs natywnej
metody, jezeli sie powiedzie -> bibliotekka zaladowana, jezeli wyjatek ->
nie...

to powyzsze napisalem po sekundzie zastanowienia, a raczej braku
zastanowienia :) pewnie dziala..., ale wtedy naszla mnie mysl zaby zajrzec
do dokumentacji metody loadLibrary:

Throws:
[...]
UnsatisfiedLinkError - if the library does not exist.

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ Ta sygnatura zostala automagicznie ]
[ Ekg: #3781111 ][ wygenerowana programem Signify v1.14. ]
[ LinuxUser: #249916 ][ Po ten i inne super programy, ]
[ zajrzyj na http://www.debian.org/ ]

Jarek Kucypera

unread,
Feb 1, 2006, 3:50:42 PM2/1/06
to
Joshua Robin wrote:

> jeszcze raz ja :)
>
> w jaki sposob sprawdzic mozna czy dana biblioteka zewnetrzna
> zostala juz zaladowana za pomoca System.loadLibrary() ??
> w klasie system nie widac takiej metody.

Spróbuj wywołać metodę natywną, poleci jakiś exception, jak biblioteka
nie załadowana.

J.K.

Joshua Robin

unread,
Feb 2, 2006, 12:39:46 PM2/2/06
to
Brzezi wrote:
> do dokumentacji metody loadLibrary:
>
> Throws:
> [...]
> UnsatisfiedLinkError - if the library does not exist.
>

no ok, ale to nie tak... bo ten wyjatek wylatuje jesli bede chcial zaladowac
biblioteke ktorej nie ma w java.library.path, wtedy ten wyjatek wyskoczy.
ale ja wiem, ze biblioteka istnieje w danej sciezce, wiem i chce zapobiec
ponownemu jej ladowaniu, jesli jest juz zaladowana do pamieci.

Joshua Robin

unread,
Feb 2, 2006, 12:46:44 PM2/2/06
to

hmm... nie wiem, moze zle zrozumialem intencje eckela, kiedy czytalem jego
ksiazke, nie mnie jednak odnioslem wrazenie, ze wystapienie w programie
wyjatku, ma byc ostatecznoscia i nie nalezy opierac dzialania programu na
wyjatkach.

moim zdaniem dziwne, ze skoro jest loadLibrary() nie ma czegos na styl
isLibraryLoaded()

nie mniej jednak, dzieki za odpowiedz :) zdaje sie ze przyjdzie mi
skorzystac z ostatecznosci.

Brzezi

unread,
Feb 2, 2006, 12:47:52 PM2/2/06
to
czw, 02 lut 2006 o 18:39 GMT, Joshua Robin napisał(a):

> ale ja wiem, ze biblioteka istnieje w danej sciezce, wiem i chce zapobiec
> ponownemu jej ladowaniu, jesli jest juz zaladowana do pamieci.

a dlaczego mialbys drugi raz ja ladowac?
a poza tym chyba jezeli juz biblioteka jest zaladowa, i jeszcze raz ja chce
sie zaladowac, to to juz chyba zostanie zignorowane

Jarek Kucypera

unread,
Feb 2, 2006, 1:21:12 PM2/2/06
to
Joshua Robin wrote:

> hmm... nie wiem, moze zle zrozumialem intencje eckela, kiedy czytalem
> jego ksiazke, nie mnie jednak odnioslem wrazenie, ze wystapienie w
> programie wyjatku, ma byc ostatecznoscia i nie nalezy opierac dzialania
> programu na wyjatkach.

Odpowiadając rygorystycznie
na Twoje pytanie, pozostaje testowe wywołane, natomiast
żeby pozostać z regułami sztuki, dodaj gdzieś swój globalny znacznik,
czy biblioteka została załadowana i ustawiaj ten znacznik tam, gdzie
wołasz loadLibrary.

> moim zdaniem dziwne, ze skoro jest loadLibrary() nie ma czegos na styl
> isLibraryLoaded()

Widać nie jest to krytyczna funckjonalnosc, gro programów po prostu
kończy działanie, jeśli nie moze załadować swoich komponentów.

J.K.

Twelve Hungry Mammoths

unread,
Feb 2, 2006, 2:20:20 PM2/2/06
to
On Thu, 02 Feb 2006 18:46:44 +0100, Joshua Robin <ku...@wojewodzki.pl>
wrote:

>
> moim zdaniem dziwne, ze skoro jest loadLibrary() nie ma czegos na styl
> isLibraryLoaded()
>
> nie mniej jednak, dzieki za odpowiedz :) zdaje sie ze przyjdzie mi
> skorzystac z ostatecznosci.

a moze zamiast marudzic, przejrzalbys javadoca? w System.loadLibrary()
czytamy:

The call System.loadLibrary(name) is effectively equivalent to the call

Runtime.getRuntime().loadLibrary(name)

klikamy wiec odnosnik do Runtime.loadLibrary(), a tam:

If this method is called more than once with the same library name, the
second and subsequent calls are ignored.

naprawde tak trudno?

pzdr
szeryf

Joshua Robin

unread,
Feb 3, 2006, 3:50:36 PM2/3/06
to
Twelve Hungry Mammoths wrote:
> a moze zamiast marudzic, przejrzalbys javadoca? w System.loadLibrary()
> czytamy:
>
> The call System.loadLibrary(name) is effectively equivalent to the call
>
> Runtime.getRuntime().loadLibrary(name)
>
> klikamy wiec odnosnik do Runtime.loadLibrary(), a tam:
>
> If this method is called more than once with the same library name,
> the second and subsequent calls are ignored.

no jednak nie do konca chyba jest ignorowana, bo kiedy tomcat, po ponownym
przekompilowaniu, laduje do pamieci klase, a co za tym idzie i blblioteke za
pomoca System.loadLibrary(), dostaje wyjatek:

Exception in thread "Thread-36" java.lang.UnsatisfiedLinkError: Native
Library blabla.dll already loaded in another classloader
at java.lang.ClassLoader.loadLibrary0(Unknown Source) (...)

a ja sytuacji ostatecznej, jak wspominalem wczesniej, chce uniknac.

>
> naprawde tak trudno?

pytalem sie uprzejmie o istnienie funkcji sprawdzajacej fakt zaladowania
biblioteki do pamieci, a Ty w ordynarny sposob pouczasz mnie jak korzystac z
dokumentacji. nie odpowiedziales konstruktywnie na pytanie i jeszcze mnie
obrazasz. wiec skoro az tak boli cie fakt mojego lamerskiego marudzenia, to
po cos w ogole odpisal na moj post i zmarnowal swoj, jakze cenny oczywiscie,
czas?

Joshua Robin

unread,
Feb 3, 2006, 3:54:44 PM2/3/06
to
Jarek Kucypera wrote:
> Odpowiadając rygorystycznie
> na Twoje pytanie, pozostaje testowe wywołane,

czyli jednak ostatecznosc czasem jest konieczna :)

> natomiast
> żeby pozostać z regułami sztuki, dodaj gdzieś swój globalny znacznik,
> czy biblioteka została załadowana i ustawiaj ten znacznik tam, gdzie
> wołasz loadLibrary.

no racja... nie wpadlem na to, nie wiem tylko czy zadziala to do sytuacji
opisanej nizej.

dzieki za _kulturalna_ odpowiedz,

Brzezi

unread,
Feb 3, 2006, 4:23:20 PM2/3/06
to
pią, 03 lut 2006 o 21:50 GMT, Joshua Robin napisał(a):

> no jednak nie do konca chyba jest ignorowana, bo kiedy tomcat, po ponownym
> przekompilowaniu, laduje do pamieci klase, a co za tym idzie i blblioteke za
> pomoca System.loadLibrary(), dostaje wyjatek:
>
> Exception in thread "Thread-36" java.lang.UnsatisfiedLinkError: Native
> Library blabla.dll already loaded in another classloader
> at java.lang.ClassLoader.loadLibrary0(Unknown Source) (...)
>
> a ja sytuacji ostatecznej, jak wspominalem wczesniej, chce uniknac.

problem jest taki, ze kazda webaplikacja dziala w swojej wlasnej
przestrzeni, ktora posiada wlasny classloader...

do tego po zreloadowaniu apliakcji tworzona jest nowa taka przestrzen...

wyglada na to ze biblioteka jest ladowana nie do tej przestrzeni, tylko
globalnie do calej instancji maszyny wirtualnej...

to teraz sprawdz czy pomimo ze biblioteka zostala zaladowana w innej
przestrzeni, to czy nadal jest dostep do jej metod natywnych...

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ BASIC is to computer programming as ]
[ Ekg: #3781111 ][ QWERTY is to typing. ]
[ LinuxUser: #249916 ][ -- Seymour Papert ]

Twelve Hungry Mammoths

unread,
Feb 3, 2006, 4:31:52 PM2/3/06
to
On Fri, 03 Feb 2006 21:50:36 +0100, Joshua Robin <ku...@wojewodzki.pl>
wrote:
>> a moze zamiast marudzic, przejrzalbys javadoca? w System.loadLibrary()
>> czytamy:
>> The call System.loadLibrary(name) is effectively equivalent to the
>> call
>> Runtime.getRuntime().loadLibrary(name)
>> klikamy wiec odnosnik do Runtime.loadLibrary(), a tam:
>> If this method is called more than once with the same library
>> name, the second and subsequent calls are ignored.
>
> no jednak nie do konca chyba jest ignorowana, bo kiedy tomcat, po
> ponownym przekompilowaniu, laduje do pamieci klase, a co za tym idzie i
> blblioteke za pomoca System.loadLibrary(), dostaje wyjatek:
>
> Exception in thread "Thread-36" java.lang.UnsatisfiedLinkError: Native
> Library blabla.dll already loaded in another classloader
> at java.lang.ClassLoader.loadLibrary0(Unknown Source) (...)
>
> a ja sytuacji ostatecznej, jak wspominalem wczesniej, chce uniknac.

a to sorry, ale to nie moja wina, ze dziala inaczej, niz pisze w javadocu.

>> naprawde tak trudno?
>
> pytalem sie uprzejmie o istnienie funkcji sprawdzajacej fakt zaladowania
> biblioteki do pamieci, a Ty w ordynarny sposob pouczasz mnie jak

ordynarny? Ty chyba nie wiesz, co to slowo znaczy...

pzdr
szeryf

Brzezi

unread,
Feb 3, 2006, 4:43:49 PM2/3/06
to
pią, 03 lut 2006 o 22:31 GMT, Twelve Hungry Mammoths napisał(a):

>> Library blabla.dll already loaded in another classloader
>> at java.lang.ClassLoader.loadLibrary0(Unknown Source) (...)
>>
>> a ja sytuacji ostatecznej, jak wspominalem wczesniej, chce uniknac.
>
> a to sorry, ale to nie moja wina, ze dziala inaczej, niz pisze w javadocu.

ale tu nie ma zadnej sprzecznosci, poniewaz biblioteka jest zladowana w
przestrzeni stworzonej przez inny classloader...

Pozdrawiam
Brzezi
--

Jarek Kucypera

unread,
Feb 4, 2006, 4:29:35 AM2/4/06
to
Joshua Robin wrote:

> Exception in thread "Thread-36" java.lang.UnsatisfiedLinkError: Native
> Library blabla.dll already loaded in another classloader
> at java.lang.ClassLoader.loadLibrary0(Unknown Source) (...)

A to tak niestety jest, przynajmiej w JVM Suna. W praktyce w przypadku
appserverów, jeśli jakaś aplikacja korzysta z biblioteki natywnej, to
nie można tej aplikacji przeładować, tylko cały serwer niestety.
Obejście jest takie, że trzeba stworzyć mała aplikacyjkę, która tylko
udostępnia klasy z natywnymi bibliotekami, wtedy główną aplikację
można przeładowywać ile się chce.

J.K.

0 new messages