没有合适的资源?快使用搜索试试~ 我知道了~
Android源码解读\Android Camera架构
5星 · 超过95%的资源 需积分: 16 104 下载量 20 浏览量
2011-06-02
20:22:27
上传
评论 2
收藏 90KB DOC 举报
温馨提示
试读
16页
Android源码解读\Android Camera架构,对Android Camera架构的详细解读
资源推荐
资源详情
资源评论
Android Camera 架构 收藏
第一部分 Camera 概述
Android 的 Camera 包含取景器(viewfinder)和拍摄照片的功能。目前 Android 发布版的
Camera 程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建
立在 Android 的进程间通讯 Binder 的结构上。
以开源的 Android 为例,Camera 的代码主要在以下的目录中:
Camera 的 JAVA 程序的路径:
packages/apps/Camera/src/com/android/camera/
其中 Camera.java 是主要实现的文件
frameworks/base/core/java/android/hardware/Camera.java
这个类是和 JNI 中定义的类是一个,有些方法通过 JNI 的方式调用本地代码得到,有
些方法自己实现。
Camera 的 JAVA 本地调用部分(JNI):
frameworks/base/core/jni/android_hardware_Camera.cpp
这部分内容编译成为目标是 libandroid_runtime.so。
主要的头文件在以下的目录中:
frameworks/base/include/ui/
Camera 底层库在以下的目录中:
frameworks/base/libs/ui/
这部分的内容被编译成库 libui.so。
Camera 服务部分:
frameworks/base/camera/libcameraservice/
这部分内容被编译成库 libcameraservice.so。
为了实现一个具体功能的 Camera,在最底层还需要一个硬件相关的 Camer 库(例如通
过调用 video for linux 驱动程序和 Jpeg 编码程序实现)。这个 库将被 Camera 的服务库
libcameraservice.so 调用。
第二部分 Camera 的接口与架构
2.1 Camera 的整体框架图 Camera 的各个库之间的结构可以用下图的表示:
<!--[endif]-->
在 Camera 系统的各个库中,libui.so 位于核心的位置,它对上层的提供的接口主要是
Camera 类,类 libandroid_runtime.so 通过调用 Camera 类提供对 JAVA 的接口,并且实现了
android.hardware.camera 类。
libcameraservice.so 是 Camera 的服务器程序,它通过继承 libui.so 的类实现服务器的功
能,并且与 libui.so 中的另外一部分内容则通过进程间通讯(即 Binder 机制)的方式进行通讯。
libandroid_runtime.so 和 libui.so 两个库是公用的,其中除了 Camera 还有其他方面的功能。
Camera 部分的头文件在 frameworks/base/include/ui/目录中,这个目录是和 libmedia.so
库源文件的目录 frameworks/base/libs/ui/相对应的。
Camera 主要的头文件有以下几个:
ICameraClient.h
Camera.h
ICamera.h
ICameraService.h
CameraHardwareInterface.h
在这些头文件 Camera.h 提供了对上层的接口,而其他的几个头文件都是提供一些接口
类(即包含了纯虚函数的类),这些接口类必须被实现类继承才能够使用。
整个 Camera 在运行的时候,可以大致上分成 Client 和 Server 两个部分,它们分别在两
个进程中运行,它们之间使用 Binder 机制实现进程间通讯。这样在客户端调用接口,功能
则在服务器中实现,但是在客户端中调用就好像直接调用服务器中的功能,进程间通讯的
部分对上层程序不可见。
从框架结构上来看,ICameraService.h、ICameraClient.h 和 ICamera.h 三个类定义了
Camera 的接口和架构,ICameraService.cpp 和 Camera.cpp 两个文件用于 Camera 架构的实现,
Camera 的从 Camera 的整体结构上,类 Camera 是整个系统核心,ICamera 类提供了 Camera
主要功能的接口,在客户端方面调用,CameraService 是 Camera 服务,它通过调用实际的
Camera 硬件接口来实现功能。事实上,图中红色虚线框的部分都是 Camera 程序的框架部
分,它主要利用了 Android 的系统的 Binder 机制来完成通讯。蓝色的部分通过调用 Camera
硬件相关的接口完成具体的 Camera 服务功能,其它的部分是为上层的 JAVA 程序提供 JNI
接口。在整体结构上,左边可以视为一个客户端,右边是一个可以视为服务器,二者通过
Android 的 Bimder 来实现进程间的通讯。
2.2 头文件 ICameraClient.h
ICameraClient.h 用于描述一个 Camera 客户端的接口,定义如下所示:
class ICameraClient: public IInterface
{
public:
DECLARE_META_INTERFACE(CameraClient);
virtual void shutterCallback() = 0;
virtual void rawCallback(const sp& picture) = 0;
virtual void jpegCallback(const sp& picture) = 0;
virtual void frameCallback(const sp& frame) = 0;
virtual void errorCallback(status_t error) = 0;
virtual void autoFocusCallback(bool focused) = 0;
};
class BnCameraClient: public BnInterface
{
public:
virtual status_t onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
};
在定义中, ICameraClient 类继承 IInterface,并定义了一个 Camera 客户端的接口,
BnCameraClient 继承了 BnInterface,这是为基于 Android 的基础类 Binder 机制实现在进程
通讯而构建的。根据 BnInterface 类模版的定义 BnInterface 类相当于双继承了 BnInterface 和
ICameraClient。
IcameraClient 这 个类的 主要 接口 是几 个回 调函 数 shutterCallback 、 rawCallback 和
jpegCallback 等,它们在相应动作发生的时候被调用。作为 Camera 的“客户端”,需要自己
实现几个回调函数,让服务器程序去“间接地”调用它们。
2.3 头文件 Camera.h
Camera.h 是 Camera 对 外 的 接 口 头 文 件 , 它 被 实 现 Camera JNI 的 文 件
android_hardware_Camera.cpp 所调用。Camera.h 最主要是定义了一个 Camera 类:
class Camera : public BnCameraClient, public IBinder:: DeathRecipient
{
public:
static sp connect();
~Camera();
void disconnect();
status_t getStatus() { return mStatus; }
status_t setPreviewDisplay(const sp& surface);
status_t startPreview();
void stopPreview();
剩余15页未读,继续阅读
dukong123
- 粉丝: 5
- 资源: 50
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页