JNI(Java Native Interface) |
|
nlj859
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
阻礙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代碼的大致流程如下圖所示:
|
conundrum
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |