hotspot/src/share/vm/prims/jni.cpp
jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) {
{- -------------------------------------------
(1) (DTrace のフック点)
---------------------------------------- -}
DTRACE_PROBE3(hotspot_jni, GetEnv__entry, vm, penv, version);
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
jint ret = JNI_ERR;
{- -------------------------------------------
(1) (DTrace のフック点)(リターン用) (See: DT_RETURN_MARK)
---------------------------------------- -}
DT_RETURN_MARK(GetEnv, jint, (const jint&)ret);
{- -------------------------------------------
(1) HotSpot が構築されてなければエラー.
---------------------------------------- -}
if (!vm_created) {
*penv = NULL;
ret = JNI_EDETACHED;
return ret;
}
{- -------------------------------------------
(1) 引数で指定された version が JVMTI のものであれば (= JvmtiExport::is_jvmti_version() が true を返せば),
JvmtiExport::get_jvmti_interface() で jvmtiEnv を取得してリターン.
---------------------------------------- -}
if (JvmtiExport::is_jvmti_version(version)) {
ret = JvmtiExport::get_jvmti_interface(vm, penv, version);
return ret;
}
{- -------------------------------------------
(1) (定数定義等)
---------------------------------------- -}
#ifndef JVMPI_VERSION_1
// need these in order to be polite about older agents
#define JVMPI_VERSION_1 ((jint)0x10000001)
#define JVMPI_VERSION_1_1 ((jint)0x10000002)
#define JVMPI_VERSION_1_2 ((jint)0x10000003)
#endif // !JVMPI_VERSION_1
{- -------------------------------------------
(1) もしカレントスレッドが対応する JavaThread を持っており, かつ引数で指定された version が
JNI のものであれば (= Threads::is_supported_jni_version_including_1_1() が true を返せば),
JavaThread::jni_environment() で JNIEnv を取得してリターン.
それ以外の場合はエラー.
---------------------------------------- -}
Thread* thread = ThreadLocalStorage::thread();
if (thread != NULL && thread->is_Java_thread()) {
if (Threads::is_supported_jni_version_including_1_1(version)) {
*(JNIEnv**)penv = ((JavaThread*) thread)->jni_environment();
ret = JNI_OK;
return ret;
{- -------------------------------------------
(1.1) もし, JVMPI のものであればエラー.
---------------------------------------- -}
} else if (version == JVMPI_VERSION_1 ||
version == JVMPI_VERSION_1_1 ||
version == JVMPI_VERSION_1_2) {
tty->print_cr("ERROR: JVMPI, an experimental interface, is no longer supported.");
tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
ret = JNI_EVERSION;
return ret;
{- -------------------------------------------
(1.1) もし, JVMDI のものであればエラー
---------------------------------------- -}
} else if (JvmtiExport::is_jvmdi_version(version)) {
tty->print_cr("FATAL ERROR: JVMDI is no longer supported.");
tty->print_cr("Please use the supported interface: the JVM Tool Interface (JVM TI).");
ret = JNI_EVERSION;
return ret;
{- -------------------------------------------
(1.1) それ以外でもエラー.
---------------------------------------- -}
} else {
*penv = NULL;
ret = JNI_EVERSION;
return ret;
}
{- -------------------------------------------
(1) カレントスレッドが JavaThread でなくても, エラー.
---------------------------------------- -}
} else {
*penv = NULL;
ret = JNI_EDETACHED;
return ret;
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.