Up Top

JNI の処理 : Invocation API の処理 : GetEnv() の処理


概要(Summary)

GetEnv() の処理は, HotSpot 内に静的に確保されている JNIEnv 構造体のアドレスをリターンするだけ (<= 正確に言うと JVMTIEnv をリターンすることもあるが... (See: here for details)).

ただし, HotSpot 内に静的に確保されている JNIEnv には 2種類ある (通常時用とデバッグ時用). どちらが使われるかはコマンドラインオプションの -Xcheck:jni の有無で決まる.

また, 実際に native method を呼び出したり JNI 関数を使用する際は, 上記の大域変数 (jni_NativeInterface, checked_jni_NativeInterface) が直接使用されるわけではない. 代わりに, 各 JavaThread が jni_environment というフィールドを持っており, そこに実際に使用する JNIEnv を格納している. native method の呼び出しや JNI 関数では, カレントスレッドの JavaThread::jnienvironment() から JNIEnv を取得して処理が行われる.

    ((cite: hotspot/src/share/vm/runtime/thread.hpp))
      // Returns the jni environment for this thread
      JNIEnv* jni_environment()                      { return &_jni_environment; }

備考(Notes)

(実際の処理時には, チェック処理が行われた後, この変数経由で通常時の JNIEnv の関数が呼ばれて JNI 処理が実行される)

    ((cite: hotspot/src/share/vm/prims/jniCheck.cpp))
    static struct JNINativeInterface_ * unchecked_jni_NativeInterface;

Subcategories


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.