<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > JNI(Java Native Interface)技術(shù)在嵌入式軟件開(kāi)發(fā)中的應用

JNI(Java Native Interface)技術(shù)在嵌入式軟件開(kāi)發(fā)中的應用

作者: 時(shí)間:2010-08-15 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/257929.htm

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

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


1 Java的性能問(wèn)題及幾種解決方案

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

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

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

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


2 JNI技術(shù)

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

(1)編寫(xiě)Java類(lèi)代碼

其中,需要JNI實(shí)現的方法應當用native關(guān)鍵字聲明。在該類(lèi)中,用System.1oadLibrary()方法加載需要的動(dòng)態(tài)鏈接庫。關(guān)鍵代碼如下:
//Compute.java
public class Compute{
public native double comp (double params);
static{
//調用動(dòng)態(tài)鏈接庫
System.loadLibrary(“mathlib”);
}

(2)編譯成字節代碼

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

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

這個(gè)過(guò)程的實(shí)現一般是通過(guò)利用jlavah-jni * class生成的,也可以手工生成該文件;但是由于Java虛擬機是根據一定的命名規范完成對JNI方法的調用,所以手工編寫(xiě)頭文件需要特別小心。
上述文件產(chǎn)生的頭文件部分代碼如下:
//Compute.h
;
extern“C”{
JNIEXPORT jdoubleJNICALL Java_Compute_comp(JNI-Env *, jobject, jdoubleArray);
;

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

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

(4)編寫(xiě)相應方法的實(shí)現代碼

在編碼過(guò)程中,需要注意變量的長(cháng)度問(wèn)題,例如Java的整型變量長(cháng)度為32位,而C語(yǔ)言為16位,所以要仔細核對變量類(lèi)型映射表,防止在傳值過(guò)程中出現問(wèn)題。

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

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

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


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

下面通過(guò)一個(gè)實(shí)例來(lái)描述運用JNI技術(shù)在手機上操縱攝像頭,捕捉視頻并存儲圖片的過(guò)程。

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

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

根據圖2的活動(dòng)/狀態(tài),具體的對應步驟如下:

①發(fā)起該流程。

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

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

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

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

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

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

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

⑨流程結束。

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

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


結 語(yǔ)

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

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



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>