詹秋芳 王巖


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