Name: rlT66838 Date: 12/13/99 Warning: JIT compiler "javacomp" not found. Will use interpreter. java version "1.2.2" Classic VM (build JDK-1.2.2-W, native threads, nojit) When one or more applet use JNI to call the same shared library, the first call in a HTML page works fine, but a second call, in the same browser session, in another HTML page fails with the exception "UnsatisfiedLinkError: Native Library already loaded in another classloader". If we call each HTML page in a different browser session, it works fine. Applets are signed with keytool. Here is a source code that demonstrate the bug. The java source was compiled under WinNT 4 with JDK 1.2-V, the windows native library Bug.dll with MS VisualC++ 6.0. The plugin used to run the applet as version 1.2.2. --------------- Main applet class Bug.java ------------------------- package Bug; import java.awt.*; import java.awt.event.*; import java.applet.*; import java.net.*; import java.lang.*; //import com.sun.java.swing.UIManager; public class Bug extends Applet { boolean isStandalone = false; //Obtenir une valeur de param?tre public String getParameter(String key, String def) { return isStandalone ? System.getProperty(key, def) : (getParameter(key) != null ? getParameter(key) : def); } //Construire l'applet public Bug() { } //Initialiser l'applet public void init() { } //D?marrer l'applet public void start() { NativeClass nc = new NativeClass(); int i = nc.Puiss( 2, 2); System.out.println( "2^2 = "+i); try { // Appel de l'URL URL url = new URL( getCodeBase().getProtocol(), getCodeBase().getHost(), getCodeBase().getPort(), "/Bug/Bug.htm"); System.out.println( "Calling URL "+url+" ..."); getAppletContext().showDocument( url); } catch (Throwable ex) { // URL d'annulation incorrecte System.out.println( "*** Error : incorrect URL !"); } } //Arr?ter l'applet public void stop() { } //D?truire l'applet public void destroy() { } //Obtenir les informations d'applet public String getAppletInfo() { return "Information applet"; } //Obtenir les informations de param?tre public String[][] getParameterInfo() { return null; } } ------------------ JNI class NativeClass.java ---------------------- package Bug; public class NativeClass { // return x^y public native int Puiss( int x, int y); static { try { System.loadLibrary("Bug"); } catch( UnsatisfiedLinkError e) { System.out.println( "*** Java Exception: "+e.toString()); } System.out.println( "Native Library Puiss loaded."); } } ------------ Header Bug_NativeClass.h of native DLL ----------------------- /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Bug_NativeClass */ #ifndef _Included_Bug_NativeClass #define _Included_Bug_NativeClass #ifdef __cplusplus extern "C" { #endif /* * Class: Bug_NativeClass * Method: Puiss * Signature: (II)I */ JNIEXPORT jint JNICALL Java_Bug_NativeClass_Puiss (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif ----------------- Source Bug_NativeClass.c of Native DLL --------------------- #include "Bug_NativeClass.h" JNIEXPORT jint JNICALL Java_Bug_NativeClass_Puiss (JNIEnv *jEnv, jobject jObj, jint x, jint y) { jint Retour = x; jint i; if (y == 0) return 1; for (i=1; i<y; i++) Retour = Retour*x; return Retour; } ------------------ First HTML Page called ------------------------ <html> <head> <title></title> </head> <body> <embed type="application/x-java-applet;version=1.2.2" width="341" height="142" align="baseline" code="Bug.Bug.class" codebase="/Bug/java" pluginspage="/Gescas/PlugIn/JRE1_2_2-win32-i.exe" archive="Bug.jar"><NOEMBED> <STRONG>Pas de support du Java Development Kit version 1.2 pour les applets !! </STRONG> </NOEMBED> </body> </html> ------------------ Source of second HTML page /Bug/Bug.htm ------------ <html> <head> <title></title> </head> <body> <p><a href="Bug2.htm">Click here to see the bug</a>...</p> </body> </html> ----------------- Source of third HTML page /Bug/Bug2.htm -------------- <html> <head> <title></title> </head> <body> <embed type="application/x-java-applet;version=1.2.2" width="341" height="142" align="baseline" code="Bug.Bug.class" codebase="/Bug/java" archive="Bug.jar"> <NOEMBED> <STRONG>Pas de support du Java Development Kit version 1.2 pour les applets !! </STRONG> </NOEMBED> </body> </html> ---------------------- End of source samples ----------------------- Here is the Plugin Java console output of the execution of this sample. -------------------- Begin console output ------------------------ Java(TM) Plug-in: Version 1.2.2.px Using JRE version 1.2.2 User home directory = C:\WINNT\Profiles\Didier User has overriden browser's proxy settings. Proxy Configuration: Manual Configuration Proxy: Proxy Overrides: JAR cache disabled. Opening http://pmf_dl.cessi.cnamts.fr/Bug/java/Bug.jar no proxy CacheHandler file name: D:\WinApps\Profils Netscape\didier_liroulet\cache\M11OTJVL.JAR Native Library Puiss loaded. 2^2 = 4 Calling URL http://pmf_dl.cessi.cnamts.fr/Bug/Bug.htm ... *** Java Exception: java.lang.UnsatisfiedLinkError: Native Library C: \DRIVERS\CP8\akl5033\bin\Bug.dll already loaded in another classloader Native Library Puiss loaded. java.lang.UnsatisfiedLinkError: Puiss at Bug.Bug.start(Bug.java:44) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) --------------- End Java console output ------------------------------ (Review ID: 98791) ====================================================================== ###@###.### 2004-05-24
|