Date: Mon, 24 Jan 2000 19:15:10 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:30242] Re: JIT =?ISO-2022-JP?B?GyRCJSQlcyU/ITwlVSUnJSQlOSRIGyhC?= JNI =?ISO-2022-JP?B?GyRCJEskRCQkJEYbKEI=?= To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <20000124193526T.shudoh at muraoka.info.waseda.ac.jp> 首藤です。 丸山さん wrote: > 古い形式のnativeインタフェースについては、 > JNIの本などにも付録的に記述されていることがあります。 > #Prentice Hall JAVA BooksのJNIなど。 古いネイティブインタフェース (ここでは old NMI と呼びます) について 僕が最初に参考にしたのは、C Magazine 誌 1996年 5月号の pp.56,57 『コラム1 nativeメソッドのインタフェイス』という記事です。 #今や手に入らないですね… > 例が、何をするプログラム片なのか全然わからないのですが、interpreter.hに > 定義されている、MkRefTableマクロを使って、 MkRefLocal マクロですよね。 JNI の local reference を作ります。 local (global) reference とは何か、も理解しておくとベターです。 JNIEnv *env; JHandle *h; // old NMI のハンドル jobject obj; // JNI での参照 とした場合、次のように h と obj の相互変換ができます。 old NMI -> JNI の変換: obj = MkRefLocal(env, h, JNI_REF_HANDLE_TAG); JNI -> old NMI の変換: h = (Hなんとか *)DeRef(env, obj); 例 h = (Hjava_lang_Thread *)DeRef(env, obj); old NMI に関する文章は少ないながら存在はしますが、 JNI と old NMI の橋渡しに関する文章はないと思います。 それこそ、JDK 付属のヘッダファイルや JDK のソースコードを 調べざるを得ないです。 JNI <-> old NMI の変換は、shuJIT よりもむしろ MOBA で多用しています。 http://www.shudo.net/moba/ > JITインタフェースはJNI以降でも小変更が行われただけのようですから、 > 基本的に、古いnativeメソッドインタフェースに則した格好をしています。 そして、JIT コンパイラでは JNI ではなく old NMI を使うのが 普通 --- というほど JIT の数は多くないですが --- だと思います。 僕がそう推測する理由はいくつかありまして - JIT インタフェースが JNI ではなく old NMI に則している。 いちいち JNI 流に変換 (JNIEnv->ExecEnv, JHandle->jobject) する必要がある。 - JIT は JNI ではできないことをする必要がある。 (クラスの JVM 内部表現へのアクセスなど。) - JNI と old NMI を比較すると、同じことをする場合、 たいていの処理では JNI の方がオーバヘッドが大きい。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp