hotspot/src/share/vm/prims/nativeLookup.cpp
// Check all the formats of native implementation name to see if there is one
// for the specified method.
address NativeLookup::lookup_entry(methodHandle method, bool& in_base_library, TRAPS) {
{- -------------------------------------------
(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.