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