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公司授權,所以要檢視的話,
接下來裡面解壓後找到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、為了加快程式的效能,而將一段時間敏感的程式碼作為本地方法實現。