Android Camera模塊分析

 

Android應用程序編程語言是JAVA,而linux的很多服務程序,包括一些libraries都是用c 或者c++寫的,應用程序使用什麼樣的機制去調用這些系統函數的呢?Java的虛擬機可以通過 System.loadLibrary 來加載本地庫,也可以通過JNI函數 RegisterNatives來註冊與類相關聯的本地方法。在Android中對於一些底層平臺相關的native函數大多采用註冊關聯的方式來調用。 
系統啓動後兩個重要的process: 
1:App_main process: 進程通過AndroidRuntime調用register_jni_procs向JNI註冊模塊的native函數供JVM調用。 
2:Mediaserver proces:進程註冊了以下幾個server: 
AudioFlinger, MediaPlayerServer;CameraService.

Android Camera Application調用native 函數流程: 
首先Android Runtime調用register_android_hardware_Camera註冊Camera相關的navtive函數到JNI。然後調用android_hardware_Camera_native_setup爲Application創建一個client 通過openCameraHardware打開設備,並連接到CameraServer。Application 開啓preview的過程與Application建立到CameraService之間連接相似。這個過程如下圖:clip_image002

從上面可以看出在JAVA VM 與native之間存在一個非常重要的連接層JNI即JAVA Native Interface。Android1.0平臺提供了Camera相關的native接口,如果這些接口不夠的話,通過這種機制我們可以方便的進行擴展,但是我們自己擴展的接口是與我們的硬件平臺相關的,並不是Android官方支持的。網上有人說Android1.0不支持JNI,Android無法執行本地JNI調用,但從Android源碼來看是乎不存在這種情況,至少是支持註冊與類相關聯的本地方法。

clip_image004

Android Architecture

JAVA process 與Native process之間的通信 
Native process姑且認爲是以c,c++語言編寫服務程序(是獨立的一個進程)。JAVA process是通常說的Android Application。還是Camera模塊爲例。我們要建立Camera Object,與CameraService Object之間的通信。 
JAVA Application調用native_setup在CameraService中創建了一個Camera客戶端,客戶端通過getCameraService取得CameraSevice中的IBinder對象,爲JAVA Application 與CamerService之間建立了一個接口ICameraService,通過這個接口我們調用BpCameraService::connect 實際上通過前面取得的IBinder對象將調用CameraService::onTransact函數在這個函數中再調用BnCameraSrvice::onTransact至此JAVA Application與CameraService之間的消息管道建立完畢。

clip_image006

上圖中,Camera.jar Camera.cpp,ICamera, ICameraService的對象都屬於java application process,當兩個object之間的通信建立完畢,java application通過ICamera接口向CameraService中Camera Client發送消息。 
在Native層,不同進程間兩個對象需要傳遞消息需要繼承IBinder接口,如果一個對象只需要發起連接可以繼承IBinder的擴展接口BpInterface,如果需要接受連接請求可以繼承BnInterface接口,比如在ICamera.cpp中有兩個接口BpCamera與BnCamera,BpCamera用於發送消息,BnCamera由CameraService繼承,最近消息響應通過BnCamera調用CameraService::client對象處理消息。 
AudioRecord,AudioFinger,MediaPlayer其底層接口實現方式與Camera類似。

發佈了0 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章