摘要:Java層 :Frameworks\base\core\java\android\hardware\Camera.javaJNI: Frameworks\base\core\jni\android_hardware_Camera.cppC++: Frameworks\av\include,Frameworks\av\camera,Frameworks\av\services\camera
Java層 :Frameworks\base\core\java\android\hardware\Camera.java
JNI: Frameworks\base\core\jni\android_hardware_Camera.cpp
C++: Frameworks\av\include,Frameworks\av\camera,Frameworks\av\services\camera 第一部分, 也即第一組binder;PS:這里發(fā)起鏈接,獲取具體模組的代理,在App進程 ICameraClient, 對應(yīng)的代理類為BpCameraClient, 對應(yīng)的服務(wù)類為BnCameraClient(抽象類), Camera(具體的實現(xiàn)類),另外 Camera還有一個父類BaseCamera 用于發(fā)送鏈接請求,接收回調(diào) 第二部分, 也即第二組Binder; PS:這里只是用來選擇、管理模組,并且在服務(wù)進程 ICameraService, 對應(yīng)的代理類為BpCameraService, 對應(yīng)的服務(wù)類為 抽象類BnCameraService, 實現(xiàn)類CameraService 用于接收請求,管理ICamera 第三部分,也即第三組Binder;PS:這里對應(yīng)Device 即具體模組,在服務(wù)進程 ICamera, 對應(yīng)的代理類為BpCamera,對應(yīng)的服務(wù)類 抽象類為BnCamera, 實現(xiàn)類為Client, 其同時也繼承BasicClient, 并且有子類CameraClient, Camera2Client 用于管理具體的攝像頭模組
調(diào)用邏輯 Camera.java 通過 JNI android_hardware_Camera 創(chuàng)建c++ 層Camera對象, 在BaseCamera中獲取ICameraServcie的代理(這個Binder服務(wù)已經(jīng)注冊到ServiceManager,可以通過名稱獲?。?,通過ICameraService代理向CameraService發(fā)起鏈接請求 并且將ICameraClient 作為回調(diào)發(fā)送到CameraService, 收到請求之后,CameraService 會根據(jù)系統(tǒng)版本選擇new CameraClient 或者 Camera2Client ,并且將ICameraClient 傳入Client中;即每一個CameraClient 都有一個對應(yīng)的回調(diào)。 然后發(fā)起鏈接的BaseCamera 從reply中讀取出ICamera的代理BpCamera。 最后就可以通過BpCamera 控制攝像頭的預(yù)覽拍照等功能。