[Seasar-user:6669] Re: [Teeda]ネイティブメソッド呼び出しについて

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2007年 3月 13日 (火) 15:51:03 JST


元場さん
米林です。

PageクラスはHOTで動作しているので
リクエストごとにHotClassLoaderという
クラスローダーを作って処理されています。
ですので、異なるクラスローダでJNIのライブラリが
ロードされる為、例外が発生していると思われます。

PageクラスをHOTに認識しつつJNI呼び出しも
正常に行うには、JNIのライブラリをロードする
クラスをdiconファイルに定義して下さい。
# diconファイルに定義したコンポーネントのクラスは
# HOTの対象では無い為

Filterをはずさずに動作する方法は以下の通りです。

TestクラスでJNI処理を行う
----------------------------------
package examples;
public class Test {
 static {
  System.loadLibrary("Test");
 }
 public native String jniMethod();
 public Test(){
 }
 public String hoge(){
  return jniMethod();
 }
----------------------------------

これを、diconファイル(例はapp.dicon)に登録
<component name="test" class="examples.Test" instance="singleton"/>

Add2ActionではDIしてもらい利用するだけ
--------------------------------------
 private Test test;
 public void setTest(Test test){
  this.test = test;
 }
 public String doCalculate() {
  int result = add2Page.getArg1() + add2Page.getArg2();
  add2Page.setResult(result);
  System.out.println("#####"+test.hoge()+"#####");
  return null;
 }
--------------------------------------

手元では独自に作成したTest.dllで試し
正常動作を確認しました。

よろしくお願いします。

From: "Motoba" <[E-MAIL ADDRESS DELETED]>
Sent: Tuesday, March 13, 2007 1:43 PM

米林様

お世話になっております。元場です。

該当のソースファイルを送付致します。
jniMethod初回だけ正常に動作して、2回目以降は UnsatisfiedLin
kError が発生する。というパターンもありました。
また、ロードするタイミングを変えることで初回から失敗したり、
初回だけ成功したりとしていました。
どのパターンにしろ2回連続で成功したことはありませんでした。
(頼りない情報で申し訳ございません・・・)

> -----Original Message-----
> From: [E-MAIL ADDRESS DELETED]
> [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of
> [E-MAIL ADDRESS DELETED]
> Sent: Tuesday, March 13, 2007 11:40 AM
> To: [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:6665] Re:[Teeda]ネイティブメソッド呼び出しについ
>>
>
> 米林です。
>
> ライブラリのロード箇所を見せて頂けますか?
> おそらく複数回ライブラリをロードしているのが
> 原因と思われます。
>
> よろしくお願いします。
>
> From: "Motoba" <[E-MAIL ADDRESS DELETED]>
> Sent: Tuesday, March 13, 2007 9:09 AM
>
> > いつもお世話になっております。元場と申します。
> >
> > Teeda1.0.5の example で ネイティブメソッドを呼び出したいので
> > すがイマイチうまくいきません。
> >
> > 具体的には Add2Action.java に
> > public native String jniMethod();
> > というネイティブメソッドを用意して、添付ファイルのdllのネイ
> > ティブメソッドを呼び出そうとしています。
> >
> > が、UnsatisfiedLinkError が発生してしまいネイティブメソッド
> > の呼び出しでエラーとなってしまいます。
> > dllのロードのタイミングやロードするクラスを何パターンか試し
> > たのですが、ネイティブメソッド呼び出しには成功しませんでし
> > た。
> > エラーの内容やログから、HotdeployClassLoader で dll がロード
> > されたり、WebappClassLoader で dll がロードされているようだ
> > ったので、hotdeployfilter をはずすことで問題なく動作すること
> > が確認できました。
> > hotdeploy は考えていないので、hotdeployfilter をはずすことは
> > 問題ないのですが、何故 hotdeployfilter が設定されているとネ
> > イティブメソッドが呼び出せないかがイマイチ分かりません。
> >
> > 何かご存知の方がいらっしゃいましたらご教授頂けると助かります

---
米林 正明
[E-MAIL ADDRESS DELETED]




Seasar-user メーリングリストの案内