閱讀Java Native源碼前的準備

來源:互聯網
上載者:User

標籤:匹配   題解   運行   閱讀   讀取   www   rom   cpu   cti   

前言

讀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下的各個標頭檔,如asmprimsooputilities等,因此解決步驟如下:

  1. 對於"precompiled.hpp",我們可以直接用編輯器將其全部替換為include "./src/share/vm/precompiled/precompiled.hpp";
  2. 對於其他諸如include "asm/assembler.hpp"#include "oops/oop.inline.hpp"#include "utilities/accessFlags.hpp"等依賴不同檔案路徑的標頭檔,利用本項目中的程式自動將其補全。
實現原理
  1. 遍曆src檔案夾下的所有檔案,找出尾碼為cpphppch的檔案,將其儲存在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)中,防止混亂。

閱讀Java Native源碼前的準備

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.