在幸福中痛苦的掙扎

          專注于效率 專注于價(jià)值
           
          書法.JAVA BLOG

          JNI技術(shù)在嵌入式軟件開發(fā)中的應(yīng)用學(xué)習(xí)筆記之二

          接上:
          (1)編寫Java類代碼
          ??? 其中,需要JNI實(shí)現(xiàn)的方法應(yīng)當(dāng)用native關(guān)鍵字聲明。在該類中,用System.1oadLibrary()方法加載需要的動(dòng)態(tài)鏈接庫(kù)。關(guān)鍵代碼如下:
          ??? //Compute.java
          ??? public class Compute{
          ??? public native double comp (double params);
          ??? static{
          ??? //調(diào)用動(dòng)態(tài)鏈接庫(kù)
          ??? System.loadLibrary(“mathlib”);
          ??? }
          ????
          (2)編譯成字節(jié)代碼
          ??? 在這個(gè)過程中,由于采用了native關(guān)鍵字聲明,Java編譯器會(huì)忽視沒有代碼體的JNI方法部分。
          ??
          ?(3)生成相關(guān)JNI方法的頭文件
          ??? 這個(gè)過程的實(shí)現(xiàn)一般是通過利用jlavah-jni * class生成的,也可以手工生成該文件;但是由于
          Java 虛擬機(jī)是根據(jù)一定的命名規(guī)范完成對(duì)JNI方法的調(diào)用,所以手工編寫頭文件需要特別小心。
          ??? 上述文件產(chǎn)生的頭文件部分代碼如下:
          ??? //Compute.h
          ??? ;
          ??? extern“C”{
          ??? JNIEXPORT jdoubleJNICALL Java_Compute_comp(JNI-Env *, jobject, jdoubleArray);
          ??? ;
          ??? JNI函數(shù)名稱分為三部分:首先是Java關(guān)鍵字,供Java虛擬機(jī)識(shí)別;然后是調(diào)用者類名稱(全限定的類名,其中用下劃線代替名稱分隔符);最后是對(duì)應(yīng)的方法名稱,各段名稱之間用下劃線分割。
          ??? JNI函數(shù)的參數(shù)也由三部分組成:首先是JNIEnv *,是一個(gè)指向JNI運(yùn)行環(huán)境的指針;第二個(gè)參數(shù)隨本地方法是靜態(tài)還是非靜態(tài)而有所不同一一非靜態(tài)本地方法的第二個(gè)參數(shù)是對(duì)對(duì)象的引用,而靜態(tài)本地方法的第二個(gè)參數(shù)是對(duì)其Java類的引用;其余的參數(shù)對(duì)應(yīng)通常Java方法的參數(shù),參數(shù)類型需要根據(jù)一定規(guī)則進(jìn)行映射。


          ??? (4)編寫相應(yīng)方法的實(shí)現(xiàn)代碼
          ??? 在編碼過程中,需要注意變量的長(zhǎng)度問題,例如Java的整型變量長(zhǎng)度為32位,而C語(yǔ)言為16位,所以要仔細(xì)核對(duì)變量類型映射表,防止在傳值過程中出現(xiàn)問題。


          ??? (5)將JNI實(shí)現(xiàn)代碼編譯成動(dòng)態(tài)鏈接庫(kù)
          ??? 編譯過程是利用C/C++編譯器實(shí)現(xiàn)的,當(dāng)要使用生成的動(dòng)態(tài)鏈接庫(kù)時(shí),調(diào)用者類中需要顯式調(diào)用該鏈接庫(kù)。
          ??? 經(jīng)過上述處理,基本上完成了一個(gè)包含本地化方法的Java類的開發(fā)。

          ???? 3 基于JNI的嵌入式手機(jī)軟件開發(fā)實(shí)例
          ??? 下面通過一個(gè)實(shí)例來描述運(yùn)用
          JNI技術(shù) 在手機(jī)上操縱攝像頭,捕捉視頻并存儲(chǔ)圖片的過程。
          ??? (1)活動(dòng)/狀態(tài)圖
          ??? 圖2為捕捉視頻并存儲(chǔ)圖片的活動(dòng)/狀態(tài)圖


          ????????????????????????????????????????????????????????????????????????????????點(diǎn)擊查看原圖
          根據(jù)圖2的活動(dòng)/狀態(tài),具體的對(duì)應(yīng)步驟如下:
          ??? ①發(fā)起該流程。
          ??? ②發(fā)起流程后,建立文件用于存儲(chǔ)圖片。
          ??? ③用指針獲得分配的緩沖器,用于存儲(chǔ)獲得的幀。
          ??? ④將指針壓棧(序列化緩沖器)。由于手機(jī)的內(nèi)存較小,為了防止內(nèi)存泄漏,Symbian操作系統(tǒng)有一個(gè)Cleanup stack的要求,即在使用指針時(shí),用PushL把指針壓入棧中,使用完后再用Pop彈出棧.如果在中間調(diào)用導(dǎo)致崩潰的函數(shù)時(shí)果真出現(xiàn)了問題,那么Clean up stack可以通過調(diào)用該指針的析構(gòu)函數(shù)回收占用的空間。
          ??? ⑤操縱攝像頭,捕捉視頻,并將圖像流從攝像頭端傳到緩沖器。
          ??? ⑥將攝像頭內(nèi)的圖像流存入緩沖器內(nèi),并將緩沖器內(nèi)的流轉(zhuǎn)化為文件流,存為jpg格式的文件,將指向緩沖器的指針彈棧。
          ??? ⑦在過程⑥中,如果使用完了序列化的緩沖器,則要重新序列化緩沖器,以備后面使用。
          ??? ⑧當(dāng)接收到停止視頻捕捉的信號(hào)后,關(guān)閉文件。
          ??? ⑨流程結(jié)束。
          ?
          ???? (2)運(yùn)用JNI
          技術(shù)的視頻捕捉
          ??? 子功能捕捉視頻的實(shí)現(xiàn)是由操縱攝像頭、視頻播放(解碼器準(zhǔn)備)以及建立攝像頭和手機(jī)之間的連接會(huì)話三個(gè)活動(dòng)組成的。其中操縱攝像頭是通過調(diào)用底層設(shè)備的驅(qū)動(dòng)來實(shí)現(xiàn)的,需要利用JNI來實(shí)現(xiàn),完成的方法包括準(zhǔn)備、建立、刪除、銷毀攝像頭等。視頻播放的一系列過程也是通過c++代碼來實(shí)現(xiàn)的,除了準(zhǔn)備、建立、刪除、銷毀解碼器外,還有開始、暫停、停止解碼等。建立攝像頭和手機(jī)之間的連接類似建立客戶端和服務(wù)器連接,視頻流從攝像頭傳到手機(jī)界面是通過多媒體會(huì)話來完成的。多媒體
          會(huì)話的建立、關(guān)閉、摧毀以及會(huì)話建立后的發(fā)送、取消、讀取數(shù)據(jù)等也是JNI的應(yīng)用范疇。

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

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


          posted on 2006-11-13 04:16 書法 閱讀(1091) 評(píng)論(0)  編輯  收藏 所屬分類: 其它相關(guān)

          My Links

          Blog Stats

          News

          常用鏈接

          留言簿(4)

          隨筆分類(6)

          隨筆檔案(6)

          文章檔案(1)

          收藏夾(4)

          友情鏈接

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜


          copyright@2006 書法(soft)版權(quán)所有.
          E_mail:posoft@126.com     點(diǎn)     點(diǎn)我找我
          主站蜘蛛池模板: 乌海市| 安乡县| 那曲县| 云霄县| 铜陵市| 尼勒克县| 什邡市| 惠水县| 隆化县| 津南区| 启东市| 内黄县| 封丘县| 吉安市| 徐汇区| 漳平市| 正镶白旗| 固阳县| 昌黎县| 两当县| 万源市| 万年县| 德令哈市| 吉木萨尔县| 永寿县| 济南市| 东城区| 苍山县| 民乐县| 南阳市| 鲁甸县| 太原市| 海宁市| 宜兰市| 塔河县| 逊克县| 和龙市| 宜州市| 佛冈县| 古蔺县| 博白县|