亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

如何用JNI技術提高Java的性能詳解

系統 1801 0

?阻礙Java獲得廣泛應用的一個主要因素是Java程序的運行效率。Java是介于解釋型和編譯型之間的一種語言,同樣的程序,如果用編譯型語言C來實現,其運行速度一般要比Java快一倍以上。Java具有平臺無關性,這使人們在開發企業級應用的時候總是把它作為主要候選方案之一,但是性能方面的因素又大大削弱了它的競爭力。為此,提高Java的性能就顯得十分重要。

? 問題的提出

????? Sun公司及Java的支持者們為提高Java的運行速度已經做出了許多努力,其中大多數集中在程序設計的方法和模式選擇方面。由于算法和設計模式的優化是通用的,對Java有效的優化算法和設計模式,對其他編譯語言也基本同樣適用,因此不能從根本上改變Java程序與編譯型語言在執行效率方面的差異。

JIT(Just In Time,及時編譯)技術是個比較好的思想。它的基本原理是:首先通過Java編譯器把Java源代碼編譯成平臺無關的二進制字節碼。然后在Java程序真正執行之前,系統通過JIT編譯器把Java的字節碼編譯為本地化機器碼。最后,系統執行本地化機器碼,節省了對字節碼進行解釋的時間。這樣做的優點是大大提高了Java程序的性能,縮短了加載程序的時間;同時,由于編譯的結果并不在程序運行間保存,因此也節約了存儲空間。缺點是由于JIT編譯器對所有的代碼都想優化,因此同樣也占用了很多時間。

動態優化技術是提高Java性能的另一個嘗試。該技術試圖通過把Java源程序直接編譯成機器碼,以充分利用Java動態編譯和靜態編譯技術來提高Java的性能。該方法把輸入的Java源碼或字節碼轉換為經過高度優化的可執行代碼和動態庫 (Windows中的. dll文件或Unix中的. so文件)。該技術能大大提高程序的性能,但卻破壞了Java的可移植性。

JNI技術

實際上,有一種通常為我們忽視的技術可以在很大程度上解決這個難題,那就是JNI(Java Native Interface, Java本地化方法)。主張采用純Java的人們通常反對本地化代碼的使用,他們認為在Java程序執行的過程中調用C/C++程序會影響程序的可移植性和安全性。還有一些人認為JNI只是對過去混合編程技術的簡單擴展,其實際目的是為了充分利用大量原有的C程序庫。

其實,我們不必拘泥于嚴格的平臺獨立性限制,因為采用JNI技術只是針對一些嚴重影響Java性能的代碼段,該部分可能只占源程序的極少部分,所以幾乎可以不考慮該部分代碼在主流平臺之間移植的工作量。同時,也不必過分擔心類型匹配問題,我們完全可以控制代碼不出現這種錯誤。此外,也不必擔心安全控制問題,因為Java安全模型已擴展為允許非系統類加載和調用本地方法。根據Java規范,從JDK 1. 2開始,FindClass將設法找到與當前的本地方法關聯的類加載器。如果平臺相關代碼屬于一個系統類,則無需涉及任何類加載器; 否則,將調用適當的類加載器來加載和鏈接已命名的類。換句話說,如果在Java程序中直接調用C/C++語言產生的機器碼,該部分代碼的安全性就由Java虛擬機控制。

JNI實現步驟

編寫JNI代碼的大致流程如下圖所示:

JNI實現流程圖

JNI實現流程圖

1. 首先編寫需要JNI功能的Java類源文件。其中,需要JNI實現的方法應當用native關鍵字聲明。在該類中,用System. loadLibrary()方法加載需要的動態鏈接庫。關鍵代碼如下:

//Compute.java

……

public class Compute {

public native double comp (double [] params);

……

static {

// 調用動態鏈接庫

System. loadLibrary(“mathlib”);

}

……

}

2. 將該類源文件用Java類編譯器編譯成二進制字節碼文件。由于采用了native關鍵字聲明,編譯器會忽視沒有代碼體的JNI方法部分。

3. 利用javah -jni *.class 生成相關JNI方法的頭文件。我們可以手工生成該文件,但是由于Java虛擬機是根據一定的命名規范完成對JNI方法的調用,所以手工編寫頭文件需要特別小心。

上述文件產生的頭文件部分代碼如下:

//Compute. h

……

extern “C” {

JNIEXPORT jdouble JNICALL Java_Compute_comp (JNIEnv *, jobject, jdoubleArray);

}

……

可以看出,JNI函數名稱分為三部分:首先是Java關鍵字,供Java虛擬機識別;然后是調用者類名稱(全限定的類名,其中用下劃線代替名稱分隔符);最后是對應的方法名稱,各段名稱之間用下劃線分割。

JNI函數的參數也由三部分組成: 首先是JNIEnv *,是一個指向JNI運行環境的指針;第二個參數隨本地方法是靜態還是非靜態而有所不同——非靜態本地方法的第二個參數是對對象的引用,而靜態本地方法的第二個參數是對其 Java 類的引用; 其余的參數對應通常 Java 方法的參數,參數類型需要根據一定規則進行映射。

4. 根據頭文件編寫相應方法的實現代碼。由于篇幅所限,具體的實現部分在此不再贅述。在編碼過程中,需要注意變量的長度問題,例如Java的整型變量長度為32位,而C語言為16位,所以要仔細核對變量類型映射表,防止在傳值過程中出現問題。

5. 利用C/C++編譯器將JNI實現代碼編譯成動態鏈接庫。調用者類中需要顯式調用該鏈接庫。

在Win32環境下,可以利用Visual C ++或其他能產生DLL文件的C/C++編譯器將實現代碼編譯成動態鏈接庫。筆者利用的是Microsoft.NET Framework的編譯器。編譯指令如下,其中%Java_HOME%是筆者的jdk安裝目錄變量:

cl -I%Java_HOME%\include

-I%Java_HOME%\include\win32

-LD jnicomp. c -Femathlib. dll

在Sun Soloaris下,相應指令為:

cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris jnicomp. c \

-o mathlib. so

注意,編譯的時候需要用I指令包含必要的庫文件路徑。

經過上述處理,就基本上完成了一個包含本地化方法的Java類的開發。

JNI技術的應用

一些主要的Java技術,如JDBC和RMI,大部分都采用JNI方式實現。但是,采用JNI確實會影響程序的平臺無關性,所以只能在特別需要的地方才能使用。通常來說,如果遇到下面的情況,我們可以考慮JNI:

● 需要直接操作物理設備,而沒有相關的驅動程序,這時候我們可能需要用C甚至匯編語言來編寫該設備的驅動,然后通過JNI調用;

● 涉及大量數學運算的部分,用Java會帶來些效率上的損失;

● 用Java會產生系統難以支付的開銷,如需要大量網絡鏈接的場合;

● 存在大量可重用的C/C++代碼,通過JNI可以減少開發工作量,避免重復開發。

另外,在利用JNI技術的時候要注意以下幾點:

● 由于Java安全機制的限制,不要試圖通過Jar文件的方式發布包含本地化方法的Applet到客戶端;

● 注意內存管理問題,雖然在本地方法返回 Java 后將自動釋放局部引用,但過多的局部引用將使虛擬機在執行本地方法時耗盡內存;

● JNI技術不僅可以讓Java程序調用C/C++代碼,也可以讓C/C++代碼調用Java代碼。


如何用JNI技術提高Java的性能詳解


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品国产a | 欧美papa| 中文字幕在线不卡视频 | 欧美日韩无线码在线观看 | 国产精品乱码免费一区二区 | 久久欧美精品欧美九久欧美 | 日韩视频在线观看一区二区 | 日本爱爱视频网站 | 一本大道香蕉大在线最新 | 欧美人交性视频在线香蕉 | 亚洲国产欧美精品一区二区三区 | 日本免费人做人一区在线观看 | 真实偷清晰对白在线视频 | 亚洲图片欧美视频 | 亚洲福利一区二区三区 | 99久久综合狠狠综合久久一区 | 天天色天天操综合网 | 伊人久久免费 | ww欧美| 久久性生大片免费观看性 | 国产精品1000部在线观看 | 欧美视频在线一区二区三区 | 免费一级毛片无毒不卡 | 香蕉人精品视频多人免费永久视频 | 四虎国产成人永久精品免费 | 国产精品v一区二区三区 | 成人综合久久精品色婷婷 | 波多野结中文字幕在线69视频 | 久久精品女人天堂 | 一区二区三 | 美女视频黄视大全视频免费网址 | 国产日韩精品视频一区二区三区 | 内部片免费一区 | 人人爱操 | 久久综合色网 | 国产精品视频播放 | 欧美一级毛片免费高清aa | 一级高清毛片免费a级高清毛片 | er久99久热只有精品国产 | 欧美另类精品 | 精品小视频在线 |