没有合适的资源?快使用搜索试试~ 我知道了~
android Camera框架分析.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 177 浏览量
2021-11-23
21:49:57
上传
评论
收藏 469KB PDF 举报
温馨提示
试读
13页
android Camera框架分析.pdf
资源详情
资源评论
资源推荐
Android 的 Camera 系统分析
一、Camera 构架分析
Android 的 Camera 包含取景(preview)和拍摄照片(take picture)的功能 。目前 Android
发布版的 Camera 程序 虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部
分,它们建立在 Android 的进程间通讯 Binder 的结构上。Android 中 Camera 模块同样遵循
Andorid 的框架,如下图所示
Camera Architecture
Camera 模块主要包含了 libandroid_runtime.so、libui.so 和 libcameraservice.so 等几个库文件 ,
它们之间的调用关系如下所示:
在 Camera 模块的各个库中,libui.so 位于核心的位置,它对上层的提供的接口主要是 Camera
类。
libcameraservice.so 是 Camera 的 server 程序,它通过继承 libui.so 中的类实现 server 的
功能,并且与 libui.so 中的另外一部分内容通过进程间通讯(即Binder 机制)的方式进行通
讯。
libandroid_runtime.so 和 libui.so 两个库是公用的,其中除了 Camera 还有其他方面的功能。整
个 Camera 在运行 的时候,可以大致上分成 Client 和 Server 两个部分,它们分别在两个进
程中运行,它们之间使用 Binder 机制实现进程间通讯。这样在 client 调用接口,功能则在
server 中实现,但是在 client 中调用就好像直接调用 server 中的功能,进程间通讯的部分对
上层程序不可见。
从框架结构上来看,源码 中 ICameraService.h、ICameraClient.h 和 ICamera.h 三个类定
义 了 MeidaPlayer的接口和 架构,ICameraService.cpp和 Camera.cpp 两个文件则用于Camera
架构的实现,Camera 的具体功能在下层调用硬件相关的接 口来实现。
从 Camera 的整体结构上,类 Camera 是整个系统 核心,ICamera 类提供了 Camera 主要功能
的接口,在客户端方面调用;CameraService 是 Camera 服务,它通过调用实际的 Camera 硬
件接口来实现功能。事实上,图中红色虚线框的部分都是Camera 程序的框架部分,它主要
利用了 Android 的系统的 Binder 机制来完成通讯。蓝色的部分通过调用 Camera 硬件相关的
接口完成具体的 Camera 服务功能,其它的部分是为上层的 JAVA 程序提供 JNI 接口。在整
体结构上,左边可以视为一个客户端,右边是一个可以视为服务器,二者通过 Android 的
Bimder 来实现进程间的通讯。
二、Camera 的工作流程概述:
①.App_main process: 进程通过 AndroidRuntime 调用 register_jni_procs 向 JNI 注册模块的
native 函数 供 JVM 调用。
AndroidRuntime::registerNativeMethods(env, "android/hardware/Camera",
camMethods, NELEM(camMethods));
其中 camMethods 定义如下:
static JNINativeMethod camMethods[] = {
{ "native_setup",
"(Ljava/lang/Object;)V",
(void*)android_hardware_Camera_native_setup },
{ "native_release",
"()V",
(void*)android_hardware_Camera_release },
{ "setPreviewDisplay",
"(Landroid/view/Surface;)V",
(void *)android_hardware_Camera_setPreviewDisplay },
{ "startPreview",
"()V",
(void *)android_hardware_Camera_startPreview },
{ "stopPreview",
"()V",
(void *)android_hardware_Camera_stopPreview },
{ "previewEnabled",
"()Z",
(void *)android_hardware_Camera_previewEnabled },
{ "setHasPreviewCallback",
"(ZZ)V",
(void *)android_hardware_Camera_setHasPreviewCallback },
{ "native_autoFocus",
"()V",
(void *)android_hardware_Camera_autoFocus },
{ "native_takePicture",
"()V",
(void *)android_hardware_Camera_takePicture },
{ "native_setParameters",
"(Ljava/lang/String;)V",
(void *)android_hardware_Camera_setParameters },
{ "native_getParameters",
"()Ljava/lang/String;",
(void *)android_hardware_Camera_getParameters },
{ "reconnect",
"()V",
(void*)android_hardware_Camera_reconnect },
{ "lock",
"()I",
(void*)android_hardware_Camera_lock },
{ "unlock",
"()I",
(void*)android_hardware_Camera_unlock },
};
JNINativeMethod 的第一个成员是一个字符 串,表示了JAVA 本地调用方法的名称,这个名
称是在 JAVA 程序中调用的名称;第二个成员也是一个字符串,表示JAVA 本地调用方法的
参数和返回值;第三个成员是 JAVA 本地调用方法对应的 C 语言函数。
②.Mediaserver proces:进程注册了以下几个 server: AudioFlinger、 MediaPlayerServer、
CameraService.
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
当向 ServiceManager 注册了 CameraService 服务后就可以响应 client 的请求了
2.client 端向 service 发送请求
①.在 java 应用 层调用 onCreate()函数得到一个上层的 Camera 对象
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Thread openCameraThread = new Thread(
new Runnable() {
public void run() {
mCameraDevice = android.hardware.Camera.open();
}
}
);
„„„„„„„„„
}
②.通过 Camera 对象的调用成员函数,而这些成员函数会调用已向 JNI 注册过的 native 函
数来调用 ICamera 接口的成员函数向 Binder Kernel Driver 发送服务请求。
③. Binder Kernel Driver 接收到 client 的请求后,通过唤醒 service 的进程来处理 client 的请
求,处理完后通过回调函数传回数据 并通知上层处理已完成。
三.Camera 库文件分析
上面已提到 Camera 模块主要包含 libandroid_runtime.so、libui.so、libcameraservice.so 和
一个与 Camera 硬件相关的底层库。其中 libandroid_runtime.so、libui.so 是与 Android 系统构
架相关的不需要对其进行修改, libcameraservice.so 和 Camera 硬件相关的底层库则是和硬
件设备相关联的,而 Canera 硬件相关的底层库实际上就是设备的 Linux 驱动,所以 Camera
设备的系统集成主要通过移植 Camera Linux 驱动和修改 libcameraservice.so 库来完成。
libcameraservice.so 库通过以下规则来构建:
构建规则略
在上面的构建规则中可以看到使用了宏 USE_CAMERA_STUB 决定 是否使用真的 Camera,
如果宏为真,则使用 CameraHardwareStub.cpp 和 FakeCamera.cpp 构造一个假的 Camera,如
果为假则使用 libcamera 来构造一个实际上的 Camera 服务。
在 CameraHardwareStub.cpp 中定义了 CameraHardwareStub 类,它继承并实现了抽象类
CameraHardwareInterface 中 定 义 的 真 正 操 作 Camera 设 备 的 所 有 的 纯 虚 函 数 。 通 过
openCameraHardware ( ) 将 返 回 一 个 CameraHardwareInterface 类 的 对 象 , 但 由 于
剩余12页未读,继续阅读
weixin_46195928
- 粉丝: 11
- 资源: 9万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现文档+程序边缘计算任务卸载与资源调度的算法,是论文的源代码,具有价值.rar
- 什么是学生成绩管理系统c++以及学习学生成绩管理系统的意义
- 什么是词向量-以及学习关于了解词向量的意义
- 什么是mybatis动态sql以及学习mybatis动态sql的意义
- 华为数据治理方法论,包括:数据治理框架、数据治理组织架构、数据治理度量评估体系以及华为数据治理案例分享
- 基于matlab实现对表面肌电信号进行归一化处理,并对归一化后的图形显示 .rar
- 基于matlab实现单级倒立摆的 T-S 模型 包括 LMI 程序源码
- 图书管理系统(struts+hibernate+spring+ext).rar
- 基于matlab实现此压缩包包含语音信号处理中的语音变声代码加音频.rar
- STM32使用PWM驱动舵机并通过OLED显示
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0