- PR -

WebLogic+JNIでのライブラリ格納ディレクトリ+設定

投稿者投稿内容
くりお
常連さん
会議室デビュー日: 2004/01/30
投稿数: 34
投稿日時: 2004-02-05 03:53
WebLogic上のServlet Helperクラスから、
JNIを通してCのライブラリにアクセスしようとしているのですが、
System.loadLibrary()実行時に、
「unsatisfiedlinkerror」が出てライブラリにリンクが出来ません。

おそらく環境設定で間違っていると思われます。
どなたか実績のある方、情報のご提供を御願いいたします。
 1)ライブラリをどこに格納したか?
 2)ライブラリロードのパスをどのように指定したか?
 3)その他注意事項は?

※WebLogicを使用しない通常のクラスでは正常に動作しています。
 「LD_LIBRARY_PATH」にlib.XXXX.slを設定

※WebLogic起動シェルに「LD_LIBRARY_PATH:lib.XXXX.sl」を設定済。
 WebLogic起動ユーザの権限ではlib.XXXX.slのパーミッションはすべてありです。

動作環境を以下に示します。
・OS:HP−UX
・AP Server:WebLogic8.1 
あら
会議室デビュー日: 2003/10/03
投稿数: 8
お住まい・勤務地: 札幌
投稿日時: 2004-02-05 08:31
不確かな情報ですけど。

HP-UXって[LD_LIBRARY_PATH]でしたっけ?
[SHLIB_PATH]だったような・・・
くりお
常連さん
会議室デビュー日: 2004/01/30
投稿数: 34
投稿日時: 2004-02-05 13:55
失礼しました。
設定していたのは
「LD_LIBRARY_PATH」ではなく「SHLIB_PATH」でした。
「SHLIB_PATH」を設定しているのですが、
なぜかライブラリがロードできないようです。
くりお
常連さん
会議室デビュー日: 2004/01/30
投稿数: 34
投稿日時: 2004-02-06 03:04
またまた失礼しました。
パッケージをつけて実行したら、
Weblogicを使用しないClassからも
「unsatisfiedlinkerror」が出て実行不可能でした。

ライブラリの配置の問題だと思うのですが、
「SHLIB_PATH」を通すだけではだめなのでしょうか・・・

手順は以下のとおりやっているのですが、手順に問題があるのでしょうか?

1.Javaソースをコンパイル
  java xxx/yyy/zzz.java
2.ヘッダを作成
  javah -verbose -jni xxx/yyy/zzz
3.ヘッダを取り込んだ、Cのライブラリをコンパイルリンク

4.ライブラリのパスにSHLIB_PATHを設定してJavaの実行
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-02-06 10:44
引用:

くりおさんの書き込み (2004-02-06 03:04) より:

パッケージをつけて実行したら、
Weblogicを使用しないClassからも
「unsatisfiedlinkerror」が出て実行不可能でした。



パッケージをつけると、JNIで呼び出すCの関数名にもパッケージ名が含まれます。
Cのソースに、この関数名を使ってますでしょうか?

たとえば、以下のクラスの場合、xxx.yyy.Zzz#jniMethod がJavaで次のように
定義されているとすると:
コード:
  package xxx.yyy;
  public class Zzz {
    public native void jniMethod();
  }


javahで生成した xxx.yyy.Zzz#jniMethod に対応するの関数名は次のようになります。
コード:
  JNIEXPORT void JNICALL Java_xxx_yyy_Zzz_jniMethod
    (JNIEnv *, jobject);

unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-02-08 12:27
unibon です。こんにちわ。

あまり良く知らないのでちゃんと説明できないのですが、考えられる点としては、Servlet コンテナはクラスローダが分離しているので、もしも static initializer の中で loadLibrary していたりすると、複数回の JNI のライブラリのロードで問題がでる可能性があります。
ただし、この場合であっても初回は成功するはずです。

もうひとつ、別の可能性としては、指定したライブラリパスを見てくれていない可能性があります。以前に Linux 上の Sun Java で、JNI を使う際に、どう指定してもライブラリをロードしてくれず、デバッガでロードしている個所を調べて使っているパスを調べた結果、
jre/lib/i386
だけしか見てくれていないことが分かり、とりあえずそこに置いたらロードできたことがあります。
#これが真の正解ではないでしょうが。
くりお
常連さん
会議室デビュー日: 2004/01/30
投稿数: 34
投稿日時: 2004-02-08 22:09
ようやくJNI連携できました。
皆さん情報ご提供ありがとうございます。

Cの実装部分に問題がありました。
以下のようにしたら動きました。

1)パッケージ名をつけたヘッダを取込
  ⇒C実装のリコンパイル
2)「SHLIB_PATH」にライブラリを配置して、Weblogigを再起動

パッケージを付けたJNIは難しいですね。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-02-09 13:04
こんにちは、おばけ@元某H/Wベンダです

すみません、もう解決されたようで蛇足ですが、
引用:

HP-UXって[LD_LIBRARY_PATH]でしたっけ?
[SHLIB_PATH]だったような・・・


hp-uxではSHLIB_PATHが正解です。
LD_LIBRARY_PATHはSolarisですよね。

スキルアップ/キャリアアップ(JOB@IT)