電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2867|回復(fù): 0
收起左側(cè)

南寧嵌入式培訓(xùn)機(jī)構(gòu)_零基礎(chǔ)可以培訓(xùn)嵌入式_淺談JNI技術(shù)在嵌入式軟件開發(fā)中的應(yīng)用

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-8-14 16:50:45 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
南寧嵌入式培訓(xùn)機(jī)構(gòu)_零基礎(chǔ)可以培訓(xùn)嵌入式_淺談JNI技術(shù)在嵌入式軟件開發(fā)中的應(yīng)用,   

嵌入式系統(tǒng)是以應(yīng)用為中心、以計算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計算機(jī)系統(tǒng)。嵌入式軟件的基本體系結(jié)構(gòu)包括嵌入式實(shí)時操作系統(tǒng)RTOS(RealTime operating Systerrl)、嵌入式設(shè)備驅(qū)動程序、嵌入式應(yīng)用程序編程接口(中間件)和嵌入式應(yīng)用程序。

現(xiàn)階段,計算機(jī)應(yīng)用的普及、互聯(lián)網(wǎng)技術(shù)的實(shí)用以及納米微電子技術(shù)的突破,正有力推動著21世紀(jì)的工業(yè)生產(chǎn)、商業(yè)活動、科學(xué)實(shí)驗(yàn)和家庭生活等領(lǐng)域自動化和信息化進(jìn)程。全過程自動化產(chǎn)品制造、大范圍電子商務(wù)活動、高度協(xié)同科學(xué)實(shí)驗(yàn)以及現(xiàn)代化家居生活,為嵌入式產(chǎn)品造就了嶄新而巨大的商機(jī)。除了溝通信息高速公路的交換機(jī)、路由器和調(diào)制解調(diào)器,構(gòu)建計算機(jī)集成制造系統(tǒng)(CIMS)所需的數(shù)據(jù)傳輸系統(tǒng)DCS(Data Communication System)和機(jī)器人以及規(guī)模較大的家用汽車電子系統(tǒng),最有產(chǎn)量效益和時代特征的嵌入式產(chǎn)品應(yīng)數(shù)因特網(wǎng)上的信息家電(information appliances),如網(wǎng)絡(luò)可視電話、網(wǎng)絡(luò)游戲機(jī)、電子商務(wù)、商務(wù)通(PDA)、移動電話以及多媒體產(chǎn)品(如電視機(jī)頂盒、DVD播放機(jī)、電子閱讀機(jī))。

眾所周知,“一次編程,到處使用”的Java軟件概念原本就是針對網(wǎng)上嵌入式小設(shè)備提出的,幾經(jīng)周折,目前SUN公司已推出了J2ME(Java 2 P1atform Micro Edition)針對信息家電的Java版本,其技術(shù)日趨成熟,開始投入使用。SUN公司Java虛擬機(jī)(JVM)技術(shù)的有序開放,使得Java軟件真正實(shí)現(xiàn)跨平臺運(yùn)行,即Java應(yīng)用小程序能夠在帶有JVM的任何硬軟件系統(tǒng)上執(zhí)行。加上Java語言本身所具有的安全性、可靠性和可移植性等特點(diǎn),對實(shí)現(xiàn)瘦身上網(wǎng)的信息家電等網(wǎng)絡(luò)設(shè)備十分有利,同時對嵌入式設(shè)備特別是上網(wǎng)設(shè)備軟件編程技術(shù)產(chǎn)生了很大的影響。

1 Java的性能問題及幾種解決方案

Java程序也有其本身的缺陷,那就是其效率問題。由于Java是一種介于解釋型和編譯型之間的語言,其對內(nèi)存的管理是通過JVM虛擬機(jī)來實(shí)現(xiàn)的,同樣的程序,如果用編譯型語言C來實(shí)現(xiàn),其運(yùn)行速度一般要比Java快得多。因此,提高Java的性能就顯得十分重要。

迄今為止,人們?yōu)樘岣逬ava的運(yùn)行速度而做出的許多努力,主要集中在程序設(shè)計的方法和模式選擇方面。但是由于算法和設(shè)計模式的優(yōu)化是通用的,對Java 有效的優(yōu)化算法和設(shè)計模式,對其他編譯語言也基本適用,因此不能從根本上改變Java程序與編譯型語言在執(zhí)行效率方面的差異。

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

動態(tài)優(yōu)化技術(shù)即提前編譯為機(jī)器碼的技術(shù)(dynamicopttmization,ahead of time technology)是提高Java性能的另一個嘗試。動態(tài)優(yōu)化技術(shù)充分利用了Java源碼編譯、字節(jié)碼編譯、動態(tài)編譯和靜態(tài)編譯的技術(shù)。其輸入是 Java的源碼或字節(jié)碼。而輸出是經(jīng)過高度優(yōu)化的可執(zhí)行代碼和動態(tài)庫(WindoW中是.dil文件,UNIX中是共享庫.a.so文件)。其優(yōu)點(diǎn)是能大大提高程序的性能,缺點(diǎn)是破壞了Java的可移植性,也對Java的安全帶來了一定的隱患。

2 JNI技術(shù)

實(shí)際上,有一種通常被忽視的技術(shù)可以在很大程度上解決這個難題,那就是JNI(Java Native Interface,Java本地化方法)。圖1是JNI技術(shù)實(shí)現(xiàn)的一般步驟。

  

(1)編寫Java類代碼

其中,需要JNI實(shí)現(xiàn)的方法應(yīng)當(dāng)用native關(guān)鍵字聲明。在該類中,用System.1oadLibrary()方法加載需要的動態(tài)鏈接庫。關(guān)鍵代碼如下:

//Compute.java

public class Compute{

public native double comp (double params);

static{

//調(diào)用動態(tài)鏈接庫

System.loadLibrary(“mathlib”);

}

(2)編譯成字節(jié)代碼

在這個過程中,由于采用了native關(guān)鍵字聲明,Java編譯器會忽視沒有代碼體的JNI方法部分。

(3)生成相關(guān)JNI方法的頭文件

這個過程的實(shí)現(xiàn)一般是通過利用jlavah-jni * class生成的,也可以手工生成該文件;但是由于Java虛擬機(jī)是根據(jù)一定的命名規(guī)范完成對JNI方法的調(diào)用,所以手工編寫頭文件需要特別小心。

上述文件產(chǎn)生的頭文件部分代碼如下:

//Compute.h

;

extern“C”{嵌入式軟件開發(fā)筆試, 嵌入式需要那些證書, 嵌入式相近視角, 做嵌入式總加班嗎, 社區(qū)嵌入式小區(qū)細(xì)則, 嵌入式電動幕布吊頂, 嵌入式h5解釋器, 安卓嵌入式歸屬地, 以下是嵌入式操作系統(tǒng), 無錫開發(fā)區(qū)嵌入式企業(yè), 嵌入式linux快速, 嵌入式開發(fā)殼程視頻, 城市社區(qū)嵌入式養(yǎng)老, 海外嵌入式電源, 嵌入式消防栓好處, 嵌入式系統(tǒng)主要企業(yè), 北航嵌入式實(shí)驗(yàn)二, 嵌入式內(nèi)存劃分, 嵌入式反木馬工具, 嵌入式系統(tǒng)free, 嵌入式軟件業(yè)務(wù)邏輯, 自動化有嵌入式, 嵌入式系統(tǒng)人機(jī)界面, 嵌入式高速通信, 研究生再學(xué)嵌入式, 嵌入式面試的問題, word嵌入式怎么, 嵌入式加載指令取數(shù), 嵌入式軟件試題, 嵌入式清除中段, 江蘇自考嵌入式試卷, 嵌入式應(yīng)聘題庫, 嵌入式三線軌道條, 哈爾濱嵌入式工程師, 物聯(lián)網(wǎng)嵌入式設(shè)備, 企業(yè)嵌入式案例分析, 軍用級嵌入式主板, 嵌入式電路板是什么, 繁星嵌入式1000, 常見的嵌入式應(yīng)用, 嵌入式基本概念, 嵌入式臺面茶盤玻璃,

JNIEXPORT jdoubleJNICALL Java_Compute_comp(JNI-Env *, jobject, jdoubleArray);

;

JNI函數(shù)名稱分為三部分:首先是Java關(guān)鍵字,供Java虛擬機(jī)識別;然后是調(diào)用者類名稱(全限定的類名,其中用下劃線代替名稱分隔符);最后是對應(yīng)的方法名稱,各段名稱之間用下劃線分割。

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

(4)編寫相應(yīng)方法的實(shí)現(xiàn)代碼

在編碼過程中,需要注意變量的長度問題,例如Java的整型變量長度為32位,而C語言為16位,所以要仔細(xì)核對變量類型映射表,防止在傳值過程中出現(xiàn)問題。

(5)將JNI實(shí)現(xiàn)代碼編譯成動態(tài)鏈接庫

編譯過程是利用C/C++編譯器實(shí)現(xiàn)的,當(dāng)要使用生成的動態(tài)鏈接庫時,調(diào)用者類中需要顯式調(diào)用該鏈接庫。

經(jīng)過上述處理,基本上完成了一個包含本地化方法的Java類的開發(fā)。

3 基于JNI的嵌入式手機(jī)軟件開發(fā)實(shí)例

下面通過一個實(shí)例來描述運(yùn)用JNI技術(shù)在手機(jī)上操縱攝像頭,捕捉視頻并存儲圖片的過程。

(1)活動/狀態(tài)圖

圖2為捕捉視頻并存儲圖片的活動/狀態(tài)圖

根據(jù)圖2的活動/狀態(tài),具體的對應(yīng)步驟如下:[!--empirenews.page--]

①發(fā)起該流程。

②發(fā)起流程后,建立文件用于存儲圖片。

③用指針獲得分配的緩沖器,用于存儲獲得的幀。

④ 將指針壓棧(序列化緩沖器)。由于手機(jī)的內(nèi)存較小,為了防止內(nèi)存泄漏,Symbian操作系統(tǒng)有一個Cleanup stack的要求,即在使用指針時,用PushL把指針壓入棧中,使用完后再用Pop彈出棧.如果在中間調(diào)用導(dǎo)致崩潰的函數(shù)時果真出現(xiàn)了問題,那么 Clean up stack可以通過調(diào)用該指針的析構(gòu)函數(shù)回收占用的空間。

⑤操縱攝像頭,捕捉視頻,并將圖像流從攝像頭端傳到緩沖器。

⑥將攝像頭內(nèi)的圖像流存入緩沖器內(nèi),并將緩沖器內(nèi)的流轉(zhuǎn)化為文件流,存為jpg格式的文件,將指向緩沖器的指針彈棧。

⑦在過程⑥中,如果使用完了序列化的緩沖器,則要重新序列化緩沖器,以備后面使用。

⑧當(dāng)接收到停止視頻捕捉的信號后,關(guān)閉文件。

⑨流程結(jié)束。

  

(2)運(yùn)用JNI技術(shù)的視頻捕捉

子功能捕捉視頻的實(shí)現(xiàn)是由操縱攝像頭、視頻播放(解碼器準(zhǔn)備)以及建立攝像頭和手機(jī)之間的連接會話三個活動組成的。其中操縱攝像頭是通過調(diào)用底層設(shè)備的驅(qū)動來實(shí)現(xiàn)的,需要利用JNI來實(shí)現(xiàn),完成的方法包括準(zhǔn)備、建立、刪除、銷毀攝像頭等。視頻播放的一系列過程也是通過c++代碼來實(shí)現(xiàn)的,除了準(zhǔn)備、建立、刪除、銷毀解碼器外,還有開始、暫停、停止解碼等。建立攝像頭和手機(jī)之間的連接類似建立客戶端和服務(wù)器連接,視頻流從攝像頭傳到手機(jī)界面是通過多媒體會話來完成的。多媒體會話的建立、關(guān)閉、摧毀以及會話建立后的發(fā)送、取消、讀取數(shù)據(jù)等也是JNI的應(yīng)用范疇。

結(jié) 語

主張采用純Java的人們通常反對本地化代碼的使用,認(rèn)為JNI技術(shù)會影響程序的可移植性和安全性。還有一些人認(rèn)為,在Java程序執(zhí)行的過程中調(diào)用c/c++程序只是對過去混合編程技術(shù)的簡單擴(kuò)展,其實(shí)際目的是為了充分利用大量原有的c程序庫。

其實(shí),不必拘泥于嚴(yán)格的平臺獨(dú)立性限制,因?yàn)椴捎肑NI技術(shù)只是針對一些嚴(yán)重影響Java性能的代碼段。該部分可能只占源程序的極少部分,所以幾乎可以不考慮該部分代碼在主流平臺之間移植的工作量。同時,也不必過分擔(dān)心類型匹配問題,完全可以控制代碼不出現(xiàn)這種錯誤。此外,也不必?fù)?dān)心安全控制問題,因?yàn)?Java安全模型已擴(kuò)展為允許非系統(tǒng)類加載和調(diào)用本地方法,即如果在Java程序中直接調(diào)用c/c++語言產(chǎn)生的機(jī)器碼,該部分代碼的安全性就由Java 虛擬機(jī)控制。
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)閉

站長推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表