1. 程式人生 > >jvm與Native Method

jvm與Native Method

今天接觸到一個native method,即原生(本地)方法,於是我對此查了一些相關資料。

 

一、Native Method

1、定義:一個native method就是一個Java呼叫非Java程式碼的介面。Java方法的具體實現由c或c++。

 

 

2、特點:與java環境外互動:與某些硬體互動資訊

        與作業系統互動,底層系統

 

3、筆記:native識別符號可與除abstract的任何Java識別符號連用,這是合理的,因為abstract沒有實現方法。

 

        含有native方法的類被子類繼承,那麼子類可以繼承native這個方法再重寫。

 

二、JVM與Native method

1、JVM(支援Java語言與執行庫):由直譯器(解釋位元組碼)和連線本地方法的庫組成。

直譯器由c編寫(與外界互動),jre庫大部分是由Java實現,也有通過一些本地方法與外界互動。

 

2、關係:

類第一次使用時,直譯器會載入位元組碼,位元組碼的開頭包含該類所有方法描述符的list(儲存地址、引數、描述符

等)。如果一個方法描述符內有native,則這個描述符塊將有一個指向該方法的指標。實現方法儲存在DLL檔案中,

被作業系統載入在Java程式的地址空間,當載入類時其相關DLL檔案不會被載入,只有當該方法被呼叫前才被載入,

通過呼叫java.system.loadLibrary()實現。

 

三、如何檢視該原生方法的原始碼

瞭解了上述相關內容以後,那麼如何才能檢視該原生方法的原始碼呢?不是說Java是一種開源軟體嗎?為何在jdk原始碼中無法檢視呢?具體詳解連結自:OpenJDK和Sun/OracleJDK 區別與聯絡  這個部落格。

檢視原生方法的原始碼方法如下:

 

Java原始碼中的native方法是不能直接在jdk中看到的,因為jdk不是開源的,要看到的話需要sun授權才行,現在只有openjdk是被sun公司授權,所以要檢視的話,

下載 完整的OpenJDK原始碼包 

 

接下來裡面解壓後找到jdk目錄(也就是OpenJDK裡的大部分類庫的實現)的內容了。其中 

 

src/
    share/       平臺無關的實現
    classes/     平臺無關的Java程式碼實現
    native/      平臺無關的native程式碼實現(主要是C)


classes與native目錄的結構就跟Java的包(package)目錄結構一樣,兩邊是對應的。知道這個關係就能很快找到JDK類庫裡Java一側宣告為native的方法在C裡的實現函式。 

 

 

四、關於Java中native的構建與適用情況(JNI)

Java不是完美的,Java的不足除了體現在執行速度上要比傳統的C++慢許多之外,Java無法直接訪問到作業系統底層(如系統硬體等),為此Java使用native方法來擴充套件Java程式的功能。

 

  可以將native方法比作Java程式同C程式的介面,其實現步驟:
  1、在Java中宣告native()方法,然後編譯。
  2、用javah產生一個.h檔案。
  3、寫一個.cpp檔案實現native匯出方法,其中需要包含第二步產生的.h檔案(注意其中又包含了JDK帶的jni.h檔案)。
  4、將第三步的.cpp檔案編譯成動態連結庫檔案。
  5、在Java中用System.loadLibrary()方法載入第四步產生的動態連結庫檔案,這個native()方法就可以在Java中被訪問了。

  JAVA的native方法適用的情況:
  1、為了使用底層的主機平臺的某個特性,而這個特性不能通過JAVA API訪問。
  2、為了訪問一個老的系統或者使用一個已有的庫,而這個系統或這個庫不是用JAVA編寫的。
  3、為了加快程式的效能,而將一段時間敏感的程式碼作為本地方法實現。