android_hardware_camera.cpp 文件中的 register_android_hardware_Camera(JNIEnv *env)函数
会将上面的 native 函数注册到虚拟机中,以供 FrameWork 层的 JAVA 代码调用。这些 native
函数通过调用 libcamera_client.so 中的 Camera 类实现具体的功能。
核心的 libcamera_client.so 动态库源代码位于: frameworks/base/libs/camera/, 实现了如下几
个类:
Camera---->Camera.cpp/Camera.h
CameraParameters—>CameraParameters.cpp/CameraParameters.h
Icamera—>ICamera.cpp/ICamera.h
IcameraClient—>ICameraClient.cpp/ICameraClient.h
IcameraService—>ICameraService.cpp/ICameraService.h
Icamera、IcameraClient、IcameraService 三个类是按照 Binder IPC 通信要求的框架实现的,用
来与 service 端通信。
类 CameraParameters 接收 FrameWork 层的 android.hardware.camera::Parameters 类为参数,
解析与格式化所有的参数设置。
Camera 是一个很重要的类, 它与 CameraService 端通过 Binder IPC 机制交互来实现具体功能。
Camera 继承自 BnCameraClient,并最终继承自 ICameraClient。
Camera 类通过:
sp sm = defaultServiceManager();
sp binder = sm->getService(String16(“media.camera”));
sp mCameraService = interface_cast(binder);
得到名字为“media.camera”的 CameraService。通过调用 CameraService 的接口 connect()返
回得到 sp mCamera,并在 CameraService 端 new 一个 CameraService::Client 类
mClient。mClient 继承自 BnCamera,并最终继承自 ICamera。
之 后 Camera 类 通 过 这 个 sp mCamera 对 象 调 用 函 数 就 像 直 接 调 用
CameraService::Client 类 mClient 的函数。CameraService::Client 类实现具体的功能。
service 端
实现在动态库 libcameraservice.so 中, 源代码位于: frameworks/base/camera/libcameraservice
Libcameraservice.so 中主要有下面两个类:
Libcameraservice.so::CameraService 类 , 继 承 自 BnCameraService , 并 最 终 继 承 自
ICameraService
Libcameraservice.so::CameraService::Client 类, 继承自 BnCamera, 并最终继承自 ICamera
CameraService::Client 类通过调用 Camera HAL 层来实现具体的功能。目前的 code 中只支持
一个 CameraService::Client 实例。
Camera Service 在 系 统 启 动 时 new 了 一 个 实 例 , 以 “ media.camera ” 为 名 字 注 册 到
ServiceManager 中。在 init.rc 中有如下代码执行可执行文件/