Tengo una aplicación web ejecutándose bajo Tomcat 3.2.1 que necesita realizar llamadas JNI en para acceder a los datos y métodos en el código heredado de C++. Se carga un servlet en inicio de la aplicación web que, como parte de su método init
, hace que un conjunto de datos específico para esa instancia de aplicación web se cargue en las estructuras de datos C++ ..dll ya cargado en otro cargador de clases?
Este código Java para este servlet contiene lo siguiente:
static
{
try {
System.loadLibrary("JCoreImpl");
System.out.println("JCoreImpl loaded");
m_bLibraryLoaded = true;
} catch (UnsatisfiedLinkError e) {
m_bLibraryLoaded = false;
System.out.println("JCoreImpl NOT loaded " + e);
}
}
cosas funcionan bien si sólo hay una aplicación web (vamos a llamarlo "webapps/AAA").
Si tengo una segunda aplicación de web ("webapps/BBB") que es idéntica a webapps/aaa excepto por el conjunto de datos utilizado en estructuras de datos el C++, a continuación, webapps/aaa pone en marcha muy bien, pero cuando webapps/bbb se inicia consigo un error indicando que:
JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library
E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader
es necesario disponer de una instancia independiente de la biblioteca nativa para cada uno de mis aplicaciones web como cada instancia debe contener los datos que son exclusivos de esa webapp particular. He buscado en los archivos de correo electrónico y leído los correos electrónicos de Craig McLanahan explicando la jerarquía del cargador de clases. Pero I have no ha podido encontrar nada específico para cargar una instancia única de una biblioteca nativa para cada aplicación web.