如何讀open jdk native 原始碼

爬蜥發表於2019-01-19

怎麼看open jdk native的原始碼

  1. 類的命名與java類的命名是一模一樣的
  2. 方法的命名為JNI的程式碼風格
  3. 一般關注下檔案頭,如果是系統檔案,比如 <sys/socket.h>, 是搜不到原始碼的,否則全域性可以搜到對應的命名

JVM_ENTRY等類似這樣的字元是啥意思?

JVM_ENTRY本身是一個巨集定義,位於interfaceSupport.hpp中

#define JVM_ENTRY(result_type, header)                                //巨集定義,每個使用這個名字的地方,都會被巨集的內容所替代
extern "C" {                                                          //表示編譯器需要按照C的方式編譯
  result_type JNICALL header {                                       
    JavaThread* thread=JavaThread::thread_from_jni_environment(env); 
    ThreadInVMfromNative __tiv(thread);                              
    debug_only(VMNativeEntryWrapper __vew;)                          
    __ENTRY(result_type, header, thread)                              

extern “C” 解釋

巨集定義

jvm_entry做了什麼

例子

java中有一個AccessController.doPrivileged方法。它對應的實現是在jvm.cpp中,原始程式碼為

JVM_ENTRY(jobject, JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException))
              #這裡是省略的方法體
JVM_END

轉換後

extern "C" {                                                          
  jobject JNICALL JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException) {                                       
    JavaThread* thread=JavaThread::thread_from_jni_environment(env); 
    ThreadInVMfromNative __tiv(thread);                              
    debug_only(VMNativeEntryWrapper __vew;)                          
    __ENTRY(result_type, header, thread) 
            #這裡是省略的方法體                                                  
      
                }
           }

附錄

JNI 簡介

相關文章