Shiro Kawai
shiro****@lava*****
2005年 1月 2日 (日) 11:58:39 JST
From: えんどう <yasuy****@javao*****> Subject: [Gauche-devel-jp] Re: Gauche-JNI? Date: Sun, 02 Jan 2005 11:28:07 +0900 > >その設計の選択によっては、JNIのAPIそのものをGaucheレベルに > >見せない方が良い (高レベルのAPIのみ見せる) 可能性もあるんじゃないか > >という気がします。 > > JNIではなくもっと上のレベルでバインディングするやり方でしょうか。 実際にやってみないとわからないですが、GC絡みとかでJNIの プリミティブをGaucheに「見せられない」可能性はあるかなと 思いました。例えばlocal referenceを直接Gauche側に返す わけにはいかないですよね。だからNewGlobalRef/DeleteGlobalRef なんかはブリッジコード内で処理して、Gaucheには見せないことに なるんじゃないかと。 > GCに関しては、 > Java 側で確保されたメモリーをGauche側が開放してしまうのはまずいですが、 > GCの対象にしない方法は選択できますでしょうか? 基本的に、Gaucheのアロケーションプリミティブ (SCM_ALLOC等) で アロケートされたもの以外のメモリについて、Gaucheは関知しません。 従ってJavaでアロケートされたメモリをGaucheが開放するということは ないです。 > JavaからGaucheを呼び出すことは考えていなかったのですが、 > JNIではクラスローダーがネイティブライブラリをアンロードするとき > JNI_OnUnloadという関数が呼ばれる仕様らしい > http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/jni/spec/invocation.html#JNI_OnUnload > ので、もしJavaからGaucheを呼び出すならこれに対応する必要がありそうです。 スクリプティングをやるなら、コールバックとかをSchemeで書きたい、 という話も出てきそうな。もしそれが無い、一方通行なら 多分話はずっと簡単だと思います。データ型を適当に変換してやる だけですから (identityが重要な場合は多少厄介ですが)。 > あとJavaが参照しているGauche側オブジェクトがGauche側でGCされちゃうのも > まずいのですね。JNIを経由する限り直接参照しないとは思いますが。 Gauche側にコールバックする場合は、Java側が間接的にでもGauche のリソースを掴むことになるので、Gauche-gtkで生じた循環参照の 問題が起きるかもしれません。 --shiro