Top


定義場所(file name)

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

説明(description)

// Check all the formats of native implementation name to see if there is one
// for the specified method.

名前(function name)

address NativeLookup::lookup_entry(methodHandle method, bool& in_base_library, TRAPS) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      address entry = NULL;
      in_base_library = false;

  {- -------------------------------------------
  (1) NativeLookup::pure_jni_name() を呼んで, 
      "__${mangled argument signature}" という部分を含まない短い名前を作成する.
     (もう少し具体的に言うと, 以下のような形式の名前
        Java_${mangled fully-qualified class name}_${mangled method name})
      ---------------------------------------- -}

      // Compute pure name
      char* pure_name = pure_jni_name(method);

  {- -------------------------------------------
  (1) 引数のサイズを計算する.
      ---------------------------------------- -}

      // Compute argument size
      int args_size = 1                             // JNIEnv
                    + (method->is_static() ? 1 : 0) // class for static methods
                    + method->size_of_parameters(); // actual parameters


  {- -------------------------------------------
  (1) まず, (上で作った) "__${mangled argument signature}" 部分のない短い名前で探索.
      (探索処理は NativeLookup::lookup_style() で行う.)
      見つかればここでリターン.
      ---------------------------------------- -}

      // 1) Try JNI short style
      entry = lookup_style(method, pure_name, "",        args_size, true,  in_base_library, CHECK_NULL);
      if (entry != NULL) return entry;

  {- -------------------------------------------
  (1) 短い名前が駄目だったので, NativeLookup::long_jni_name() を呼んで, 
      "__${mangled argument signature}" 部分まで含んだ長い名前を作成する.
      ---------------------------------------- -}

      // Compute long name
      char* long_name = long_jni_name(method);

  {- -------------------------------------------
  (1) "__${mangled argument signature}" まで含んだ長い名前で探索.
      (探索処理は NativeLookup::lookup_style() で行う.)
      見つかればここでリターン.
      ---------------------------------------- -}

      // 2) Try JNI long style
      entry = lookup_style(method, pure_name, long_name, args_size, true,  in_base_library, CHECK_NULL);
      if (entry != NULL) return entry;

  {- -------------------------------------------
  (1) 次に, os 固有の prefix/suffix を付けずに, "__${mangled argument signature}" 部分のない短い名前を探索.
      (探索処理は NativeLookup::lookup_style() で行う.)
      見つかればここでリターン.
      ---------------------------------------- -}

      // 3) Try JNI short style without os prefix/suffix
      entry = lookup_style(method, pure_name, "",        args_size, false, in_base_library, CHECK_NULL);
      if (entry != NULL) return entry;

  {- -------------------------------------------
  (1) 次に, os 固有の prefix/suffix を付けずに, "__${mangled argument signature}" まで付けた長い名前で探索.
      (探索処理は NativeLookup::lookup_style() で行う.)
      見つかればここでリターン.
      ---------------------------------------- -}

      // 4) Try JNI long style without os prefix/suffix
      entry = lookup_style(method, pure_name, long_name, args_size, false, in_base_library, CHECK_NULL);

  {- -------------------------------------------
  (1) ここまでやって見つからなければ NULL を返す.
      ---------------------------------------- -}

      return entry; // NULL indicates not found
    }

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