Android Camera Application調(diào)用native 函數(shù)流程:
首先Android Runtime調(diào)用register_android_hardware_Camera注冊(cè)Camera相關(guān)的navtive函數(shù)到JNI。然后調(diào)用android_hardware_Camera_native_setup為Application創(chuàng)建一個(gè)client 通過(guò)openCameraHardware打開(kāi)設(shè)備,并連接到CameraServer。Application 開(kāi)啟preview的過(guò)程與Application建立到CameraService之間連接相似。這個(gè)過(guò)程如下圖:
從上面可以看出在JAVA VM 與native之間存在一個(gè)非常重要的連接層JNI即JAVA Native Interface。Android1.0平臺(tái)提供了Camera相關(guān)的native接口,如果這些接口不夠的話,通過(guò)這種機(jī)制我們可以方便的進(jìn)行擴(kuò)展,但是我們自己擴(kuò)展的接口是與我們的硬件平臺(tái)相關(guān)的,并不是Android官方支持的。網(wǎng)上有人說(shuō)Android1.0不支持JNI,Android無(wú)法執(zhí)行本地JNI調(diào)用,但從Android源碼來(lái)看是乎不存在這種情況,至少是支持注冊(cè)與類(lèi)相關(guān)聯(lián)的本地方法。
Android Architecture
JAVA process 與Native process之間的通信
Native process姑且認(rèn)為是以c,c++語(yǔ)言編寫(xiě)服務(wù)程序(是獨(dú)立的一個(gè)進(jìn)程)。JAVA process是通常說(shuō)的Android Application。還是Camera模塊為例。我們要建立Camera Object,與CameraService Object之間的通信。
JAVA Application調(diào)用native_setup在CameraService中創(chuàng)建了一個(gè)Camera客戶端,客戶端通過(guò)getCameraService取得CameraSevice中的IBinder對(duì)象,為JAVA Application 與CamerService之間建立了一個(gè)接口ICameraService,通過(guò)這個(gè)接口我們調(diào)用BpCameraService::connect 實(shí)際上通過(guò)前面取得的IBinder對(duì)象將調(diào)用CameraService::onTransact函數(shù)在這個(gè)函數(shù)中再調(diào)用BnCameraSrvice::onTransact至此JAVA Application與CameraService之間的消息管道建立完畢。
上圖中,Camera.jar Camera.cpp,ICamera, ICameraService的對(duì)象都屬于java application process,當(dāng)兩個(gè)object之間的通信建立完畢,java application通過(guò)ICamera接口向CameraService中Camera Client發(fā)送消息。
在Native層,不同進(jìn)程間兩個(gè)對(duì)象需要傳遞消息需要繼承IBinder接口,如果一個(gè)對(duì)象只需要發(fā)起連接可以繼承IBinder的擴(kuò)展接口BpInterface,如果需要接受連接請(qǐng)求可以繼承BnInterface接口,比如在ICamera.cpp中有兩個(gè)接口BpCamera與BnCamera,BpCamera用于發(fā)送消息,BnCamera由CameraService繼承,最近消息響應(yīng)通過(guò)BnCamera調(diào)用CameraService::client對(duì)象處理消息。
AudioRecord,AudioFinger,MediaPlayer其底層接口實(shí)現(xiàn)方式與Camera類(lèi)似。
聯(lián)系客服