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文件。

  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/allenwas3/p/6773380.html
Copyright © 2011-2022 走看看