Top


定義場所(file name)

hotspot/src/share/vm/prims/jni.cpp

名前(function name)

jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) {

本体部(body)

  {- -------------------------------------------
  (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.