22

レガシ 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 のネイティブ ライブラリの一意のインスタンスを読み込むことに固有のものを見つけることができませんでした。

4

4 に答える 4

15

同じネイティブ ライブラリを 2 回読み込むことはできません。

クラスを の下の jar ファイルに入れると、<tomcat>/lib/すべての戦争で共有されます。

于 2009-06-23T06:51:52.457 に答える
9

Tomcat HowTo wiki ( http://wiki.apache.org/tomcat/HowTo )の Tomcat でJNI を使用しているときにクラスローダーの問題が発生するセクションを参照してください。

于 2009-07-08T23:34:27.187 に答える