ネイティブ・ライブラリーは、.dll、.so などのプラットフォーム固有のライブラリー・ファイル、または
*SRVPGM オブジェクトであり、共有ライブラリー内で構成することができます。
ネイティブ・ライブラリーは、共用ライブラリーがアプリケーションに関連付けられている場合、
常にそのアプリケーション・クラス・ローダーに対して可視です。
同様に、共用ライブラリーがアプリケーション・サーバーに関連付けられている場合、ネイティブ・ライブラリーは、
そのアプリケーション・サーバーのクラス・ローダーに対して可視です。
始める前に
共用ライブラリーの設計では、Java ネイティブ・ライブラリーのサポートについて、次の条件を考慮します。
- Java 仮想マシン (JVM) は、特定のネイティブ・ライブラリーをロードするのに 1 つのクラス・ローダーのみを許可します。
- クラス・ローダーからネイティブ・ライブラリーをアンロードするアプリケーション・プログラミング・インターフェース (API) はありません。
ネイティブ・ライブラリーは、
そのライブラリーを検出したクラス・ローダーがガーベッジ・コレクションでヒープから収集されるときに、JVM によってアンロードされます。
- アプリケーション・サーバーのクラス・ローダーは、アプリケーション・サーバーが継続している間は持続します。
- アプリケーションのクラス・ローダーは、アプリケーションが停止するか、または動的に再ロードされるまで持続します。
ネイティブ・ライブラリー・パスで構成された共用ライブラリーが
アプリケーションに関連付けられている場合、アプリケーションは、再始動されるか、
または動的に再ロードされると、UnsatisfiedLinkError で失敗する場合があ
ります。このエラーは、ライブラリーがすでにロードされていることを示します。
このエラーが発生するのは、アプリケーションが、再始動するときに、
ネイティブ・ライブラリーを再ロードする共用ライブラリー・クラスを呼び出すためです。
しかし、ネイティブ・ライブラリーは、先にネイティブ・ライブラリーをロードした
アプリケーションのクラス・ローダーがガーベッジ・コレクションで収集されていないので、まだメモリーにロードされた状態のままです。
- 従属ネイティブ・ライブラリーをロードできるのは、JVM クラス・ローダーのみです。
例えば、
NativeLib1 が NativeLib2 に従属する場合、NativeLib2 は、JVM クラス・ローダーから可視である必要があります。LIBPATH 環境変数によって定義されている Java ライブラリー・パスで、NativeLib2
を含むパスが指定されている必要があります。
共用ライブラリー内で構成される
ネイティブ・ライブラリーが、他のネイティブ・ライブラリーに従属する場合、
その従属ライブラリーが正常にロードされるためには、
従属ライブラリーが、アプリケーション・サーバーをホストする JVM の LIBPATH に構成されている必要があります。
このタスクについて
「shared
library settings」ページで共用ライブラリーを構成する際、
「
Native Library Path」に値を指定しても、このパス上のネイティブ・ライブラリーは、
このネイティブ・ライブラリーをロードするクラス自体が同じクラス・ローダーによってロードされていない限り、
WebSphere Application Server
アプリケーションまたは共用ライブラリーのクラス・ローダーからは見付けられません。
ネイティブ・ライブラリーは、1 つのクラス・ローダーによって複数回ロードすることができないので、
アプリケーション・サーバーの
クラス・ローダーに関連付けられた共有ライブラリー内でネイティブ・ライブラリーをロードする方が適切と言えます。
これは、これらのクラス・ローダーがサーバーの存続期間中は持続するためです。
プロシージャー
- ネイティブ・ライブラリーをロードするクラスの静的メソッドをインプリメントします。
ネイティブ・ライブラリーをロードするクラスの
静的ブロックで System.loadLibrary(native_library) を呼び出します。以下に例を示します。
static {System.loadLibrary("native_library");
native_library は、クラスの静的初期化の間にロードされます。初期化は、クラスがロードされるときに 1 回だけ行われます。
- 「shared library settings」
ページで、共有ライブラリーがネイティブ・ライブラリーをロードするための
「Classpath」、および「Native Library Path」の値を設定します。
- アプリケーション・サーバーのクラス・ローダーに、
共用ライブラリーを関連付けます。
共用ライブラリーを、アプリケーションではなく、アプリケーション・サーバーのクラス・ローダーに関連付けることにより、
サーバー上でアプリケーションが再始動、または動的に再ロードされても、共有ライブラリーのロードは、必ず、
アプリケーション・サーバーのクラス・ローダーによる 1 回のみです。ネイティブ・ライブラリーは静的ブロック内でロードされるため、
そのネイティブ・ライブラリーが複数回ロードされることはありません。