JNI技術(shù)如何在嵌入式軟件開(kāi)發(fā)中應用?
①發(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 虛擬機控制。
評論