Top


定義場所(file name)

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

名前(function name)

static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) {

本体部(body)

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