怎麼看open jdk native的原始碼
- 類的命名與java類的命名是一模一樣的
- 方法的命名為JNI的程式碼風格
- 一般關注下檔案頭,如果是系統檔案,比如 <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)
例子
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)
#這裡是省略的方法體
}
}