<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    在幸福中痛苦的掙扎

    專注于效率 專注于價值
     
    書法.JAVA BLOG

    JNI技術在嵌入式軟件開發中的應用學習筆記之二

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


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


    ??? (5)將JNI實現代碼編譯成動態鏈接庫
    ??? 編譯過程是利用C/C++編譯器實現的,當要使用生成的動態鏈接庫時,調用者類中需要顯式調用該鏈接庫。
    ??? 經過上述處理,基本上完成了一個包含本地化方法的Java類的開發。

    ???? 3 基于JNI的嵌入式手機軟件開發實例
    ??? 下面通過一個實例來描述運用
    JNI技術 在手機上操縱攝像頭,捕捉視頻并存儲圖片的過程。
    ??? (1)活動/狀態圖
    ??? 圖2為捕捉視頻并存儲圖片的活動/狀態圖


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

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

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


    posted on 2006-11-13 04:16 書法 閱讀(1084) 評論(0)  編輯  收藏 所屬分類: 其它相關

    My Links

    Blog Stats

    News

    常用鏈接

    留言簿(4)

    隨筆分類(6)

    隨筆檔案(6)

    文章檔案(1)

    收藏夾(4)

    友情鏈接

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜


    copyright@2006 書法(soft)版權所有.
    E_mail:posoft@126.com     點     點我找我
    主站蜘蛛池模板: 全黄大全大色全免费大片| 亚洲精品无码专区在线| 亚洲熟妇av一区二区三区漫画| 亚洲国产成人精品无码区花野真一| 性做久久久久久免费观看| 国产成人免费手机在线观看视频| 亚洲中文久久精品无码| 一级日本高清视频免费观看| 亚洲av中文无码| 中文字幕在线视频免费| 亚洲精品成人片在线播放| 中文字幕乱码一区二区免费| 国产成人免费爽爽爽视频| 国产gv天堂亚洲国产gv刚刚碰| 91视频免费观看高清观看完整| 亚洲产国偷V产偷V自拍色戒 | 中文字幕在线成人免费看| 亚洲韩国精品无码一区二区三区| 日本视频免费高清一本18| 国产国产人免费人成免费视频| 看成年女人免费午夜视频| 国产精品亚洲产品一区二区三区 | 久久国产精品成人片免费| 亚洲专区一路线二| 国产hs免费高清在线观看| 99999久久久久久亚洲| 永久免费av无码网站yy| 亚洲精品成人图区| 久久精品成人免费观看97| 亚洲一区二区三区首页| 一级做a爰片久久毛片免费看| 亚洲日韩欧洲乱码AV夜夜摸| 免费人成视频在线观看网站| 色噜噜亚洲男人的天堂| 亚洲精品高清一二区久久| 国产偷国产偷亚洲高清人| 亚洲色中文字幕无码AV| 国产情侣激情在线视频免费看| 亚洲色大成网站www永久一区 | 亚洲日产韩国一二三四区| 1000部羞羞禁止免费观看视频|