レガシ C++ コードのデータとメソッドにアクセスするために JNI 呼び出しを行う必要がある Tomcat 3.2.1 で実行されている webapp があります。Web アプリケーションの起動時にサーブレットがロードされ、そのinit
メソッドの一部として、その Web アプリケーション インスタンスに固有のデータ セットが C++ データ構造にロードされます。
このサーブレットの Java コードには、次のものが含まれています。
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);
}
}
webapp が 1 つしかない場合は問題なく動作します (「webapps/aaa」と呼びましょう)。
C++ データ構造で使用されるデータ セットを除いて webapps/aaa と同一の 2 番目の webapp (「webapps/bbb」) がある場合、webapps/aaa は問題なく起動しますが、webapps/bbb が起動すると、次のようなエラー:
JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library
E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader
各インスタンスには特定の Web アプリに固有のデータを含める必要があるため、Web アプリごとにネイティブ ライブラリの個別のインスタンスが必要です。私はメールアーカイブを検索し、Craig McLanahan によるクラスローダーの階層を説明する電子メールを読みました。しかし、各 webapp のネイティブ ライブラリの一意のインスタンスを読み込むことに固有のものを見つけることができませんでした。