QA@IT

javaでdllを利用する際にUnsatisfiedLinkErrorになる

9330 PV

javaでWebアプリケーションを作成しております。
その中でDLLファイルを利用しています。

その際、複数のアプリケーションからDLLファイルを利用すると、

java.lang.UnsatisfiedLinkError: Native Library C:\work\foo.dll already loaded in another classloader

となります。
エラーの理由自体は分かるのですが、解決策が分かりません。

DLLファイルを呼ぶ際のみ、javaプログラム中でjava.library.pathを書き換えて→元に戻す。
で動作はするのですが、根本解決にならないかと思っています。

このような場合どのようにするのが良いのでしょうか。
ご教授よろしくお願いします。

備考

DLLは自作のものではなく、改変等はできません。

開発環境

JDK : 1.6.0
AP : Tomcat6.0

回答

ざっと Google で検索してみただけですが、以下のような対応策はどうでしょうか?
☆注意: 動作確認など 当方は裏を取っていません。あしからず。

http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat
に記述のある対処方法を試してみる。。。

すなはち
■対処その1 (ただし、単発アプリだと動作するから、こちらはすでに対策されているのだと想像しました...)

  class FooWrapper {
      static {
          System.loadLibrary("foo");
      }
      native void doFoo();
    }

■対処その2
JNDI の jar ファイルについて

$CATALINA_HOME/shared/lib

に配置する.

ちなみに、「$CATALINA_HOME/shared/lib」が存在しなければ、作成したうえで 「$CATALINA_HOME/conf/catalina.properties」に 「shared.loader=$CATALINA_HOME/shared/lib」の記述を追加する、という手順が必要になる、とリンク先では書いてありました。

いずれにしても、Web アプリケーション・サーバーは Web アプリケーションごとにクラスローダーを持つので、そこではロードされない、Web アプリケーション・サーバーの根っこのレベルのクラスローダーにおいて DLL ファイルをロードしてもらうのが重要であろうと考えます。

幸運を祈ります。

編集 履歴 (5)
ウォッチ

この質問への回答やコメントをメールでお知らせします。