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