Android Camera Module Architecture and Bottom layer communication mechanism -----------albertChen 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之間串連相似。這個過程如: 從上面可以看出在JAVA VM 與native之間存在一個非常重要的串連層JNI即JAVA Native Interface。Android1.0平台提供了Camera相關的native介面,如果這些介面不夠的話,通過這種機制我們可以方便的進行擴充,但是我們自己擴充的介面是與我們的硬體平台相關的,並不是Android官方支援的。網上有人說Android1.0不支援JNI,Android無法執行本地JNI調用,但從Android源碼來看是乎不存在這種情況,至少是支援註冊與類相關聯的本地方法。 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之間的訊息管道建立完畢。
中,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類似。 |