Android2.3的Camera架构介绍

一、Camera概述


Android 的Camera 包含取景器(preview)、拍摄照片、摄像等的功能。目前Android发布版的Camera程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们通过Binder进行客户端与服务端之间的数据和控制交互。

 Camera的代码主要在以下的目录中:

 Camera的JAVA程序的路径:

 packages/apps/Camera/src/com/android/camera/  其中Camera.java是APK实现的框架文件

frameworks/base/core/java/android/hardware/Camera.java  应用API开发包android.hardware.camera类以及其相关嵌套类的JAVA层定义,通过native声明调用JNI中定义的C++层代码,有些方法通过JNI的方式调用本地代码得到,有些方法自己实现。

该文件中的Camera类提供图像预览设定、开启关闭预览、拍照、摄像数据检索等功能,同时Camera类为Camera应用客户端的一个实例。

 

Camera的JAVA本地调用部分(JNI):
 frameworks/base/core/jni/android_hardware_Camera.cpp

这部分内容编译成为目标是libandroid_runtime.so。用于实现JAVA空间到C++空间的映射与引用。 

 

Camera客户端与服务端Binder接口实现:

 frameworks/base/libs/camera/

 这部分的内容被编译成库libcamera_client.so。

 

 Camera服务部分:
 frameworks/base/services/camera/libcameraservice/

这部分内容被编译成库libcameraservice.so

 

主要的头文件在以下的目录中:

frameworks/base/include/camera/
 

Camera硬件抽象层:

满足CameraHardwareInterface.h接口定义的硬件抽象实现,一般位于hardware目录下。


二、Camera的架构分析


首先基于代码层次的Camera的整体框架图,Camera的各个库之间的结构可以用下图的表示:



android开发过程中因采用组建式开发与分层设计原理,各部分代码有明显的层次关系与模块表征。因此我们的Camera开发就可以被分成下面一些部分:用户Camera APK开发、Camera API层约定(开发初期根据模块功能定义)、Camera JAVA层到C++本地实现层接口定义、应用层进程与服务端进程通信接口与实现、摄像头服务端实现、基于服务层约定接口的硬件抽象层实现、基于V4L2的Linux底层驱动支持、摄像头驱动支持。那么我们在阅读Camera代码时,就可以根据侧重点有选择的阅读,而不至于迷失在复杂的层次间转换和兼容与安全性考虑的细节中。

在进一步研究Camera前我们需要首先搞明白要实现Camera我们必须完成:

       应用端与服务端的对接

       应用对设备端的配置与查询

       设备端向应用端投递图像数据与设定结果


三、Camera的接口分析


接口分析主要侧重调用关系的梳理,方便在开发过程中定位问题与理清应用开发的调用顺序,摄像头私有辅助功能的添加。于是我们可以得到如下的一副层次关系图:

  在上图中AndroidRuntime、android_hardware_camera、JNI、camera的对象都属于java application process,而camerservice、camerahardwarestub则属于media process。当两个进程之间的通信通道建立完毕并且CameraService完成私有客户端的实例化后,java application通过ICamera接口向CameraService中Camera Client发送消息,同时CameraService通过ICameraClient向应用进程回传(notify)各种通知信息。

不同进程间两个对象需要传递消息需要继承IBinder接口,接口端又对IBinder接口进行了简单的封装即:BpInterface(代理)、BnInterface(本地调用)。如在ICamera.cpp中有两个接口BpCamera与BnCamera,BpCamera用于发送消息,BnCamera由CameraService继承,最近消息响应通过BnCamera调用CameraService::client对象处理消息。


四、总结


AndroidCamera开发主要分应用开发、框架搭建、驱动层实现三部分,目前的开发工作主要为APK开发与驱动移植。APk开发以兼容性为重点而驱动开发则以良好的可移植性为重点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值