zoukankan      html  css  js  c++  java
  • 如何定位jdk中的native方法源码?

    前提条件:已下载openjdk的源码。

    以System类的arraycopy为例:

    1. 根据关键字定位文件:grep -rn '"arraycopy"' ./openjdk
    关键字:"arraycopy"
    文件:./openjdk/jdk/src/share/native/java/lang/System.c

    /* Only register the performance-critical methods */
    static JNINativeMethod methods[] = {
      {"currentTimeMillis", "()J", (void *)&JVM_CurrentTimeMillis},
      {"nanoTime", "()J", (void *)&JVM_NanoTime},
      {"arraycopy", "(" OBJ "I" OBJ "II)V", (void *)&JVM_ArrayCopy},
    };

    2. 然后查找JVM_ArrayCopy的实现:grep -rn 'JVM_ArrayCopy' ./hotspot
    文件:./openjdk/hotspot/src/share/vm/prims/jvm.cpp
    关键字:JVM_ArrayCopy

    JVM_ENTRY(void, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos, jobject dst, jint dst_pos, jint length))
      JVMWrapper("JVM_ArrayCopy");
      // Check if we have null pointers
      if (src == NULL || dst == NULL) {
        THROW(vmSymbols::java_lang_NullPointerException());
      }
      arrayOop s = arrayOop(JNIHandles::resolve_non_null(src));
      arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst));
      assert(s->is_oop(), "JVM_ArrayCopy: src not an oop");
      assert(d->is_oop(), "JVM_ArrayCopy: dst not an oop");
      // Do copy
      s->klass()->copy_array(s, src_pos, d, dst_pos, length, thread);
    JVM_END

    3. 想看看类arrayOop的定义:但是用 grep -rn 'class arrayOop' ./hotspot 查不到结果
    于是 grep -rn 'arrayOop' ./hotspot 从输出中一行一行排查,结果发现./openjdk/hotspot/src/share/vm/oops/oopsHierarchy.hpp文件中有一行:
    typedef class arrayOopDesc* arrayOop;
    这又是什么语法呢?

    不管如何,定位jdk native方法的c++源码,大致流程如上。

    其实文件命名应该是有规律可循的,System.java对应System.c文件,而Unsafe.java对应的却是unsafe.cpp文件。

  • 相关阅读:
    SQL作业的操作全
    ISAPI Rewrite 实现简单url重写、二级域名重写
    wwf mvc学习
    如何扩大内需
    惊喜
    无限级分类查询
    杂记
    20130118SQL记录
    百度调价HttpWebRequest
    检查外链的方法
  • 原文地址:https://www.cnblogs.com/allenwas3/p/6773380.html
Copyright © 2011-2022 走看看