hotspot/src/share/vm/prims/jni.cpp
static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
methodHandle method(THREAD, JNIHandles::resolve_jmethod_id(method_id));
{- -------------------------------------------
(1) (JavaCalls::call() では引数を JavaCallArguments オブジェクトに入れて渡す必要があるので)
JavaCallArguments オブジェクトを用意し,
引数で渡された JNI_ArgumentPusher オブジェクト(args)にセットしておく.
---------------------------------------- -}
// Create object to hold arguments for the JavaCall, and associate it with
// the jni parser
ResourceMark rm(THREAD);
int number_of_parameters = method->size_of_parameters();
JavaCallArguments java_args(number_of_parameters);
args->set_java_argument_object(&java_args);
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(method->is_static(), "method should be static");
{- -------------------------------------------
(1) JNI_ArgumentPusher::iterate() を呼んで,
JavaCallArguments オブジェクト内に引数を詰め直す.
---------------------------------------- -}
// Fill out JavaCallArguments object
args->iterate( Fingerprinter(method).fingerprint() );
{- -------------------------------------------
(1) JavaValue::set_type() を呼んで,
引数で渡された JavaValue (result) に返値の型をセットしておく
---------------------------------------- -}
// Initialize result type
result->set_type(args->get_ret_type());
{- -------------------------------------------
(1) JavaCalls::call() によって, 引数で指定されたメソッドを呼び出す.
---------------------------------------- -}
// Invoke the method. Result is returned as oop.
JavaCalls::call(result, method, &java_args, CHECK);
{- -------------------------------------------
(1) 返値がポインタ(オブジェクト or 配列)の場合には, JNI Handle 化しておく.
---------------------------------------- -}
// Convert result
if (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY) {
result->set_jobject(JNIHandles::make_local(env, (oop) result->get_jobject()));
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.