.dll già caricato in un altro classloader?

Ho una webapp in esecuzione in Tomcat 3.2.1 che deve effettuare chiamate JNI per accedere a dati e metodi nel codice C ++ legacy. Un servlet viene caricato all’avvio della webapp che, come parte del suo metodo init , fa sì che un set di dati specifico per quell’istanza webapp venga caricato nelle strutture di dati C ++.

Questo codice Java per questo servlet contiene quanto segue:

 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); } } 

Le cose funzionano bene se c’è una sola webapp (chiamiamola “webapps / aaa”).

Se ho una seconda webapp (“webapps / bbb”) identica a webapps / aaa tranne che per il set di dati usato nelle strutture di dati C ++, allora webapps / aaa si avvia correttamente, ma quando webapps / bbb viene avviato ricevo un errore che afferma che:

 JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader 

Ho bisogno di avere un’istanza separata della libreria nativa per ciascuna delle mie webapps dato che ogni istanza deve contenere dati che sono univoci per quella particolare webapp. Ho cercato negli archivi di posta elettronica e ho letto le e-mail di Craig McLanahan che spiegavano la gerarchia del classloader. Ma non sono stato in grado di trovare nulla di specifico per caricare un’istanza unica di una libreria nativa per ogni webapp.