On Thursday 24 of November 2005 14:31,
jnejedly-lGykP6lMTpSlVyrhU4qvOw@xxxxxxxxxxxxxxxx wrote:
>
Má knihovnu DLL kterou volám z Javy (JNI). Např. takto
>
>
public class MYDll {
>
public static void main(String [ ] args) {
>
MYDl dll = new MYDll();
>
}
>
...
>
public static native String Hello();
>
static {
>
System.loadLibrary("mydll");
>
}
>
}
>
>
a někde v kódu pak zavolám
>
>
MYDll.Hello();
>
>
Pokusy a omyly jsem zjistil, že DLL musí být někde v Library Path , mám ji
>
ve C:\Windows\System32
>
>
Ve vývojovém prostředí (JDeveloper) vše funguje, Problém v deployi na
>
aplikační server Oracle AS 10g. První deploy aplikace je v pořádku, jakmile
>
ale chci nahrát novější verzi naší aplikace (undeploy staré + deploy nové)
>
obdržím po spuštění výjimku:
>
>
java.lang.UnsatisfiedLinkError: Native Library C:
>
\WINDOWS\system32\MYDll.dll already loaded in another classloader
>
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1525)
>
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1485)
>
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
>
at java.lang.System.loadLibrary(System.java:834)
>
at MYDll.<clinit>(MYDll.java:19)
>
...
>
...
>
at java.lang.Thread.run(Thread.java:534)
>
>
Z téhle výjimky se nedokážu zotavit jinak než restarem celého OC4J na
>
aplikačním serveru.
No nejdřív musím říct, že cpát JNI na aplikační server je IMHO pěkná prasárna
a appserver to IMHO pěkně degraduje, ale to jen tak na okraj. Asi mate dobrý
důvod takovouto prasárnu udělat.
Přiznám se, že nevím, jak se zachová Wokenní aplikace při upgradu knihovny.
IMHO si bude stále držet tu stávající, takže se na tu novou nedostane. Takže
pro načtení knihovny stejně potřebujete restartovat proces, což JDeveloper
určitě dělá taky, neboť aplikace v něm neběží přímo, ale běží v nové instanci
JVM.
Potom by stálo za pokus načíst tuto knihovnu ve dvou odlišných EARech. Pokud
se to nepovede, můžete zkusit vnutit DLLko nějak přímo AppServeru. Pokud se
to povede (pokud ne, jste v kyblu nebo se musite vic snazit vnutit knihovnu
defaultnimu classloaderu), zkuste nahodit v jednom serveru nejprve první app
se starší verzí DLL a poté s novější. Pokud i toto, projde, pak je to záhada.
Pokud neprojde, je jasné, že se vám to nepodaří.
Jinak tato vyjimka tvrdi, ze se snazite nacist jiz jednou nactenou knihovnu,
jenomze byla nactena jiz neexistujicim classloaderem. Jestli je toto chovani
spravne ci nikoli, buh sud, protoze kdyz se juknete do ClassLoader.java,
doctete se:
synchronized (loadedLibraryNames) {
if (loadedLibraryNames.contains(name)) {
throw new UnsatisfiedLinkError
("Native Library " +
name +
" already loaded in another classloader");
}
Takže už je to doufám jasnější. Nepomůže-li ani google, nepomůže ani
svěcená :-)
--
Oto 'tapik' Buchta, tapik-aiBFbcymABNWk0Htik3J/w@xxxxxxxxxxxxxxxx
Senior Engineer, Systinet Corp,
http://www.systinet.com
Thread at a glance:
Previous Message by Date:
click to view message preview
Re: UnsatisfiedLinkError, dll already loaded
jnejedly-lGykP6lMTpSlVyrhU4qvOw@xxxxxxxxxxxxxxxx wrote:
Pokusy a omyly jsem zjistil, že DLL musí být někde v Library Path , mám ji
ve C:\Windows\System32
Tohlke se da i nekde docist, tuism v on-line dokumentaci od SUNu.
Ve vývojovém prostředí (JDeveloper) vše funguje, Problém v deployi na
aplikační server Oracle AS 10g. První deploy aplikace je v pořádku, jakmile
ale chci nahrát novější verzi naší aplikace (undeploy staré + deploy nové)
obdržím po spuštění výjimku:
java.lang.UnsatisfiedLinkError: Native Library C:
\WINDOWS\system32\MYDll.dll already loaded in another classloader
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1525)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1485)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at MYDll.<clinit>(MYDll.java:19)
...
...
at java.lang.Thread.run(Thread.java:534)
Uplne stejny problem mam u TomCatu. Ten ma primo v RELEASE-NOTES napsano:
=======================
JNI Based Applications:
=======================
Applications that require native libraries must ensure that the
libraries have
been loaded prior to use. Typically, this is done with a call like:
static {
System.loadLibrary("path-to-library-file");
}
in some class. However, the application must also ensure that the
library is
not loaded more than once. If the above code were placed in a class inside
the web application (i.e. under /WEB-INF/classes or /WEB-INF/lib), and the
application were reloaded, the loadLibrary() call would be attempted a
second
time.
To avoid this problem, place classes that load native libraries outside
of the
web application, and ensure that the loadLibrary() call is executed only
once
during the lifetime of a particular JVM.
Tohle je samozrejme v primem rozporu s tvrzenim v JavaDocu pro
Runtime.loadLibrary() volany ze System.loadLibrary():
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Runtime.html#loadLibrary(java.lang.String)
If this method is called more than once with the same library
name, the second and subsequent calls are ignored.
Bohuzel pravdu ma dokumentace TomCatu, druhe zavolani se neignoruje,
a vyprodukuje UnsatisfiedLinkError.
Jedine reseni je dat tridy, ktere pouzivaji nativni knihovny, do
specialniho jaru, ktery se da do nejakeho classloaderu, ktery
je nebude znovu nacitat. V pripade Tomcatu do $CATALINA_BASE/shared/lib,
u Oracle budete muset najit neco podobneho.
Makub
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Supercomputing Center Brno Martin Kuba
Institute of Computer Science email:
makub-8qz54MUs51PtwjQa/ONI9g@xxxxxxxxxxxxxxxx
Masaryk University http://www.ics.muni.cz/~makub/
Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775
--------------------------------------------------------------
smime.p7s
Description: S/MIME Cryptographic Signature
Next Message by Date:
click to view message preview
UnknownHostException
Dobry den,
najednou mne Netbeans zacaly hlasit nasledujici chybu a nemuzu se z nich
a ani z jinych Java programu (a nefunguje ani JavaWebStart) dostat na
internet.
java.net.UnknownHostException: mystation.mydomain.cz: mystation.mydomain.cz
at java.net.InetAddress.getLocalHost(InetAddress.java:1292)
at org.netbeans.CLIHandler.initialize(CLIHandler.java:480)
at org.netbeans.CLIHandler.initialize(CLIHandler.java:284)
at org.netbeans.Main.execute(Main.java:159)
at org.netbeans.Main.main(Main.java:39)
Zajimave je, ze kdyz se prihlasim pod rootem, tak to jde. Spis si
myslim, ze se stalo neso v systemu (Mdk10.1), ale vubec si nemuzu
vzpomenout na nic, co by to mohlo zpusobit. Nesetkal jste se s tim nekdo?
Dekuji za pripadne nasmerovani
Karel
Previous Message by Thread:
click to view message preview
Re: UnsatisfiedLinkError, dll already loaded
Zdravim
Este 2 zaujimave pikosky bokom od hlavneho problemu povodneho tazatela
ohladom JNI:
- nativnu kniznicu musite loadovat v triede v ktorej sa nachadzaju
nativne metody v nej definovane... Skoda, stacilo by
S tim nesouhlasim. V jedne webove aplikaci jsme nativni knihovnu
nahravali uplne jinou tridou nez ve ktere byly nativni metody.
Ta trida a tedy i nativni knihovna byla nahravana uplne jinym
classloaderem (shared classloader tomcatu, prave proto aby slo
delat redeploy webove aplikace, samozrejme bez redeploye nativni
knihovny). Musite ale samozrejme zajistit aby se
inicializacni kod v te jine tride nahravajici knihovnu spustil predtim
nez volate nativni metody (nahravani tridy do classloaderu a
jeji staticky inicializator se spousti az pri prvem pozadavku na danou
tridu, ne pri startu JVM).
Provozovano na Sun JDK 1.3 i 1.4 a bez problemu to bezelo na Linuxu i
Windows (s patricnou verzi so nebo dll samozrejme).
No a unload nativni knihovny pryc z bezici JVM je asi dost platformove
zavisly, umim si predstavit platformy ktere to nedokazou (i kdyz nevim
zda takove opravdu existuji/neexistuji, nejak jsem to nikdy nestudoval).
A preto... kodujte cisto.. 100% pure java... :-)))
Zkuste najit nebo napsat 100% pure Java knihovnu pro lemmatizaci ceskych
slov ;-)
Vlastik
--
Ing. Vlastimil Elias Qbizm technologies, a.s.
vedouci analytik ... the art of software.
____________________________________________________________________
www.qbizm-technologies.cz www.qbizm.cz www.qbizm-services.cz
Next Message by Thread:
click to view message preview
UnknownHostException
Dobry den,
najednou mne Netbeans zacaly hlasit nasledujici chybu a nemuzu se z nich
a ani z jinych Java programu (a nefunguje ani JavaWebStart) dostat na
internet.
java.net.UnknownHostException: mystation.mydomain.cz: mystation.mydomain.cz
at java.net.InetAddress.getLocalHost(InetAddress.java:1292)
at org.netbeans.CLIHandler.initialize(CLIHandler.java:480)
at org.netbeans.CLIHandler.initialize(CLIHandler.java:284)
at org.netbeans.Main.execute(Main.java:159)
at org.netbeans.Main.main(Main.java:39)
Zajimave je, ze kdyz se prihlasim pod rootem, tak to jde. Spis si
myslim, ze se stalo neso v systemu (Mdk10.1), ale vubec si nemuzu
vzpomenout na nic, co by to mohlo zpusobit. Nesetkal jste se s tim nekdo?
Dekuji za pripadne nasmerovani
Karel