詹秋芳 王巖
摘? ?要:Eclipse作為一款Java IDE開發(fā)環(huán)境,受到越來越多程序員的喜愛。但是Eclipse對JNI開發(fā)的支持并不友好,很多操作都需要切換到控制臺上輸入命令來完成,并且不支持對Native函數(shù)的調(diào)試,這些不利因素無形中增加了JNI開發(fā)的成本與難度。文章基于國產(chǎn)平臺,系統(tǒng)研究了Eclipse插件開發(fā)技術(shù),根據(jù)JNI開發(fā)的特點,結(jié)合用戶實際需求,在Eclipse中分別實現(xiàn)了JNI的可視化開發(fā)以及調(diào)試開發(fā),從Java工程到C工程無縫銜接,界面友好、操作便利,實現(xiàn)了Eclipse環(huán)境下對JNI快速開發(fā)的支撐,增強了Eclipse IDE的功能,豐富了國產(chǎn)平臺的軟件生態(tài)環(huán)境,對于國產(chǎn)平臺的產(chǎn)業(yè)化發(fā)展具有重要的學術(shù)意義及應用價值。
關(guān)鍵詞:國產(chǎn)平臺;Java本地接口;集成開發(fā)環(huán)境;Java開發(fā)工具;C/C++開發(fā)工具
Eclipse作為一款Java IDE開發(fā)環(huán)境,受到越來越多程序員的喜愛。Java是一類解釋性語言,具有跨平臺執(zhí)行的特性,但是該特性勢必會有部分性能損耗,因此,在開發(fā)過程中,如果有實時性的要求,那么通常會采用面向底層、速度更快的語言來實現(xiàn),JNI技術(shù)就是可以實現(xiàn)Java調(diào)用另一種語言的函數(shù)[1]。但是使用過JNI開發(fā)的人都知道,目前,Eclipse IDE對JNI并沒有提供可視化開發(fā)手段,程序員需要啟動終端,手動敲入命令執(zhí)行部分代碼,最后,仍需切回到Eclipse IDE調(diào)用驗證,而且Eclipse IDE對JNI的調(diào)試也沒有提供好的解決方案。
針對這一現(xiàn)狀,本文將研究“Eclipse JNI快速開發(fā)支撐技術(shù)”的設(shè)計與實現(xiàn),通過Eclipse插件技術(shù),實現(xiàn)JNI開發(fā)的可視化以及JNI Native函數(shù)調(diào)試的一體化,滿足JNI開發(fā)的便捷性、實用性的需求,優(yōu)化Eclipse IDE環(huán)境。
1? ? 國產(chǎn)平臺
國產(chǎn)平臺主要是指國產(chǎn)硬件、國產(chǎn)基礎(chǔ)軟件以及其他國產(chǎn)應用軟件[2]。在基于增強國產(chǎn)平臺自主可控能力的共識下,大力推進國產(chǎn)平臺產(chǎn)業(yè)化發(fā)展,積極與產(chǎn)業(yè)上下游廠商密切合作,構(gòu)建完善的國產(chǎn)軟硬件生態(tài)系統(tǒng),包括芯片、硬件、軟件、整機系統(tǒng)各個環(huán)節(jié),將其應用于通用服務(wù)器、大數(shù)據(jù)、網(wǎng)絡(luò)安全、安全存儲、工業(yè)控制等領(lǐng)域[3]。目前,無論是國產(chǎn)硬件還是國產(chǎn)軟件,部分關(guān)鍵技術(shù)尚未掌握,自主核心技術(shù)難以為繼,既需要耗費大量精力解決硬件適配問題,又需要持續(xù)滿足應用開發(fā)單位對最新軟件開發(fā)工具的需要,還需要為用戶提供最新、最易用的應用軟件。國產(chǎn)平臺生態(tài)環(huán)境僅解決有無問題,離可用、好用都有一定的距離。
2? ? Eclipse及JNI開發(fā)介紹
Eclipse是一個集成開發(fā)環(huán)境,為用戶提供可視化的開發(fā)手段,該開發(fā)環(huán)境初衷主要支持Java等各種應用的開發(fā),可以采用插件的技術(shù)來增強Eclipse框架的支撐能力[4]。JNI是Java標準平臺中的一個重要功能,彌補了Java與平臺無關(guān)這一重大不足,在Java實現(xiàn)跨平臺的同時,也能與其他語言(如C,C++)的動態(tài)庫進行交互,給其他語言發(fā)揮優(yōu)勢的機會[5]。使用JNI進行開發(fā)的優(yōu)勢有以下幾點。
2.1? 運行效率提高
目前,國產(chǎn)平臺的CPU頻率明顯低于X86架構(gòu),當硬件性能暫時無法提升時,對于Java應用來說,實時性要求高的任務(wù)可以用C/C++語言來實現(xiàn),Java和C/C++之間可以采用JNI來實現(xiàn)通信,這樣也能比較好地解決Java應用效率低下的問題。
2.2? 內(nèi)存管理利用率高
Java的內(nèi)存全部由虛擬機來管理,C/C++語言由程序員來管理,可以靈活地操作內(nèi)存,內(nèi)存利用率會高很多。
2.3? 防破解
由于Native函數(shù)采用C/C++語言來實現(xiàn),會編譯成二進制機器代碼,所以對于產(chǎn)品的核心技術(shù)采用JNI來實現(xiàn),這樣不易破解。
如果使用了JNI,那么Java程序就喪失了跨平臺的優(yōu)點,對于JNI Native函數(shù)部分的代碼,不同平臺架構(gòu)往往需要重新編譯,所以Java應用程序是否使用JNI技術(shù)需要考慮業(yè)務(wù)需求,是效率優(yōu)先還是部署為重。
通常情況JNI開發(fā)的步驟如下:
(1)在Java文件中編寫Native調(diào)用接口,形如:
(2)定義對應的JNI Native函數(shù)的實現(xiàn)。
①通過命令javah,生成Native函數(shù)對應的頭文件(.h)。
②根據(jù)生成的頭文件(.h)創(chuàng)建一個對應的源文件(.cpp),文件中包含Native函數(shù)實現(xiàn),用戶可以在函數(shù)內(nèi)實現(xiàn)具體業(yè)務(wù)需求。
③編譯源文件(.cpp),生成與架構(gòu)相關(guān)的動態(tài)庫。
④在Java程序中通過JNI直接調(diào)用Native函數(shù)以驗證功能是否正常。
在上面的步驟中,①和③均需要切換到命令行終端上運行,②需要用戶手動創(chuàng)建和編輯源文件。由此可見,目前在Eclipse IDE環(huán)境下進行JNI開發(fā)異常繁瑣。本文提出的JNI快速開發(fā)支撐技術(shù),很好地解決了這個問題。
3? ? JNI快速開發(fā)支撐技術(shù)的實現(xiàn)方案
JNI快速開發(fā)支撐包括“可根據(jù)Native函數(shù)接口自動創(chuàng)建相應C/C++工程”“在Eclipse IDE環(huán)境中支持Java主程序?qū)ative函數(shù)的調(diào)試”兩部分。這兩部分功能均可作為一個獨立的程序模塊,采用Eclipse插件技術(shù)來實現(xiàn),能夠動態(tài)地添加和自由地刪除,比較方便集成到Eclipse IDE環(huán)境中。
3.1? JNI可視化開發(fā)
JNI可視化開發(fā)的功能可概括為:(1)由Native函數(shù)生成頭文件(.h)及源文件(.cpp)框架。(2)創(chuàng)建可生成動態(tài)庫的C/C++工程,且工程中需包含相應源文件。(3)C/C++工程編譯后得到的動態(tài)庫能夠被Java主程序自動加載。上述功能實現(xiàn)起來表現(xiàn)為一個連續(xù)且完整的過程,實現(xiàn)過程如圖1所示。
打開Eclipse工程瀏覽界面,用戶單擊Java文件時,通過菜單或按鈕,激活JNI可視化開發(fā)插件提供的Native函數(shù)的轉(zhuǎn)換功能,生成Native函數(shù)接口的頭文件(.h)。用戶可選擇生成的頭文件(.h),插件根據(jù)頭文件自動創(chuàng)建相應C/C++工程,且工程中包含相應源文件(.cpp)框架,該框架根據(jù)Native頭文件的函數(shù)聲明來實現(xiàn),用戶僅需實現(xiàn)業(yè)務(wù)邏輯即可。C/C++工程編譯后產(chǎn)生的動態(tài)庫文件生成到指定路徑下,原Java工程可自動加載該路徑下的動態(tài)庫。
3.2? JNI調(diào)試開發(fā)
JNI調(diào)試開發(fā)是指在Eclipse IDE環(huán)境下,Java主程序調(diào)試運行到Native函數(shù)時,能夠自動啟動GDB進程調(diào)試Native C/C++函數(shù)主體,并且在IDE環(huán)境中提供堆棧、變量、寄存器等調(diào)試信息顯示窗口供用戶診斷。JNI調(diào)試開發(fā)包括調(diào)試環(huán)境設(shè)置模塊、調(diào)試通信模塊以及調(diào)試信息顯示模塊。調(diào)試環(huán)境設(shè)置模塊需要設(shè)置C/C++源文件位置、C/C++動態(tài)庫和調(diào)試信息路徑以及GDB Attach模式設(shè)置等。調(diào)試通信模塊實現(xiàn)Java調(diào)試器與GDB調(diào)試進程之間的通信。調(diào)試信息顯示模塊用來顯示變量、寄存器、加載模塊以及堆棧信息。
如果沒有安裝JNI調(diào)試開發(fā)插件,那么在調(diào)試Java主程序時,遇到Native函數(shù)的調(diào)用,通常情況下調(diào)試流程是沒有辦法進入到Native C/C++函數(shù)主體內(nèi)部的。在JNI調(diào)試開發(fā)插件的支撐下,調(diào)試運行到Native函數(shù)調(diào)用處時,將會啟動GDB進程,并且附加到正在調(diào)試運行的Java主程序進程空間中[6]。GDB進程在啟動的同時,會加載已經(jīng)配置好的Native C/C++函數(shù)的動態(tài)庫及調(diào)試信息,定位Native C/C++函數(shù)的源文件。加載完成后,GDB進程暫停在Native C/C++函數(shù)入口處,此時,可激活相應的調(diào)試堆棧,調(diào)試狀態(tài)將會從Java主程序空間切換到Native C/C++函數(shù)空間,此時,Java主程序處于等待狀態(tài)。接著,可以遵循GDB的調(diào)試命令調(diào)試Native C/C++函數(shù)主題。Native C/C++函數(shù)調(diào)試結(jié)束后,需要斷開GDB進程與Java主程序的連接,調(diào)試狀態(tài)會重新返回到Java主程序上,此時,Java主程序?qū)ative C/C++函數(shù)的調(diào)試過程才結(jié)束。帶有Native函數(shù)的Java主程序調(diào)試流程如圖2所示。
4? ? 結(jié)語
本文重點論述了在國產(chǎn)平臺下Eclipse集成開發(fā)環(huán)境對JNI快速開發(fā)支撐技術(shù)的實現(xiàn)方案。首先,介紹了當前國產(chǎn)平臺下的軟件生態(tài)環(huán)境現(xiàn)狀。其次,指出了目前JNI開發(fā)的現(xiàn)狀,提出了JNI快速開發(fā)支撐方案,滿足JNI開發(fā)的便捷性、實用性的需求,對繁榮國產(chǎn)平臺的產(chǎn)業(yè)化發(fā)展具有重要的學術(shù)意義及應用價值。
[參考文獻]
[1]任俊偉,林東岱.JNI技術(shù)實現(xiàn)跨平臺開發(fā)的研究[J].計算機應用研究,2005(7):180-184.
[2]程健,吳蔚.國產(chǎn)計算平臺在指揮控制系統(tǒng)中的應用研究[J].自動化與信息工程,2011(3):41-44.
[3]倪光南.發(fā)展自主可控的信息技術(shù)和產(chǎn)業(yè)[J].電子產(chǎn)品世界,2015(10):25-26.
[4]張旻,麥先根,賈璐.Eclipse插件開發(fā)技術(shù)淺探[J].航空計算技術(shù),2006(6):17-18.
[5]董偉巍.JNI技術(shù)在網(wǎng)絡(luò)交互中的應用[J].電子設(shè)計工程,2016(6):125-127.
[6]蘭利東,喬永強.GDB遠程調(diào)試環(huán)境的設(shè)計與實現(xiàn)[J].單片機與嵌入式系統(tǒng)應用,2005(10):22-25.