hotspot/src/share/vm/prims/jni.cpp
static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) {
{- -------------------------------------------
(1) メソッド名とシグネチャをもとに, 対応する methodOop を取得する.
もし見つからなければ NoSuchMethodError.
---------------------------------------- -}
methodOop method = Klass::cast(k())->lookup_method(name, signature);
if (method == NULL) {
ResourceMark rm;
stringStream st;
st.print("Method %s name or signature does not match",
methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name, signature));
THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
}
{- -------------------------------------------
(1) もし methodOop は見つかったが native ではなかった場合, prefix が足りていない可能性が考えられるので,
find_prefixed_native() で JVMTI で指定された prefix を付けた名前で探索する.
もし, それでも見つからなければ, NoSuchMethodError.
---------------------------------------- -}
if (!method->is_native()) {
// trying to register to a non-native method, see if a JVM TI agent has added prefix(es)
method = find_prefixed_native(k, name, signature, THREAD);
if (method == NULL) {
ResourceMark rm;
stringStream st;
st.print("Method %s is not declared as native",
methodOopDesc::name_and_sig_as_C_string(Klass::cast(k()), name, signature));
THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(), st.as_string(), false);
}
}
{- -------------------------------------------
(1) 見つかった methodOop に対して, 登録または登録の削除を行う.
* entry が NULL でなければ, methodOop::set_native_function() を呼んで,
指定されたネイティブ関数のアドレスを登録する.
* 逆に entry が NULL であれば, methodOop::clear_native_function() を呼んで,
登録を削除する.
---------------------------------------- -}
if (entry != NULL) {
method->set_native_function(entry,
methodOopDesc::native_bind_event_is_interesting);
} else {
method->clear_native_function();
}
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
if (PrintJNIResolving) {
ResourceMark rm(THREAD);
tty->print_cr("[Registering JNI native method %s.%s]",
Klass::cast(method->method_holder())->external_name(),
method->name()->as_C_string());
}
{- -------------------------------------------
(1) リターン
---------------------------------------- -}
return true;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.