天天看點

閱讀Java Native源碼前的準備

前言

讀java native源代碼時,我們一般會去網站下載下傳openjdk8源碼http://download.java.net/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip ,然後進行分析,随後很多文章會讓你編譯。其實,如果隻是為了分析源碼,完全不用編譯,直接找到hotspot檔案夾下的src檔案夾檢視即可,這裡就是hotspot的源碼。

注意:官網的源碼下載下傳位址寫錯了,它寫成了http://www.java.net/download/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip,這個網址是打不開的

存在的問題

源碼中的include 路徑不全,導緻很多函數無法跳轉,隻得手動查找,很不友善。以

./src/cpu/sparc/vm/assembler_sparc.cpp

檔案為例,原始代碼是這樣的:

#include "precompiled.hpp"
#include "asm/assembler.hpp"
#include "asm/assembler.inline.hpp"

int AbstractAssembler::code_fill_byte() {
  return 0x00;                  // illegal instruction 0x00000000
}
           

我們希望是這樣的:

#include "./src/share/vm/precompiled/precompiled.hpp"
#include "./src/share/vm/asm/assembler.hpp"
#include "./src/share/vm/asm/assembler.inline.hpp"

int AbstractAssembler::code_fill_byte() {
  return 0x00;                  // illegal instruction 0x00000000
}
           

分析問題&解決方案

當然,我們可以手動尋找對應的頭檔案,然後一個一個補全;但是檔案數量有上千個,這樣會耗費許多時間,也是以有了本項目——自動補全include中的路徑。檢視不同檔案中的include路徑,發現有兩大類,一類是

include "precompiled.hpp"

,一類是包含在檔案夾

./src/share/vm

下的各個頭檔案,如

asm

prims

oop

utilities

等,是以解決步驟如下:

  1. 對于

    "precompiled.hpp",我們可以直接用編輯器将其全部替換為

    include "./src/share/vm/precompiled/precompiled.hpp"`;
  2. 對于其他諸如

    include "asm/assembler.hpp"

    #include "oops/oop.inline.hpp"

    #include "utilities/accessFlags.hpp"

    等依賴不同檔案路徑的頭檔案,利用本項目中的程式自動将其補全。

源碼

參見https://github.com/xiaoxi666/ModifyIncludePath

實作原理

  1. 周遊src檔案夾下的所有檔案,找出字尾為

    cpp

    hpp

    c

    h

    的檔案,将其儲存在List中;同時将對應的檔案夾路徑儲存在Set中(之是以選擇Set而不是List是因為同一檔案夾下可能有很多檔案,而檔案夾儲存一次就好);
  2. 處理List中儲存的檔案,每個檔案處理時讀取Set中比對的檔案夾,将諸如

    #include "asm

    等形式替換成

    #include "./src/share/vm/asm

    ,即可。

其他問題

還有一些檔案依賴于特定的平台,如

./src/share/vm/utilities/copy.hpp

中:

#ifdef TARGET_ARCH_x86
# include "copy_x86.hpp"
#endif
#ifdef TARGET_ARCH_sparc
# include "copy_sparc.hpp"
#endif
#ifdef TARGET_ARCH_zero
# include "copy_zero.hpp"
#endif
#ifdef TARGET_ARCH_arm
# include "copy_arm.hpp"
#endif
#ifdef TARGET_ARCH_ppc
# include "copy_ppc.hpp"
#endif
           

此種代碼程式并未處理,是以依賴平台的函數還是有可能找不到,有需要的可以将程式中的

static String startInclude = "#include \"";

替換為

static String startInclude = "# include \"";

再運作一次即可(注意#和include之間多了一個空格)。

運作須知

本程式運作時,建議将hotspot的源碼目錄src單獨放在工程下的一個檔案夾(本項目中為

/Resource

)中,防止混亂。

『注:本文來自部落格園“小溪的部落格”,若非聲明均為原創内容,請勿用于商業用途,轉載請注明出處http://www.cnblogs.com/xiaoxi666/』