没有合适的资源?快使用搜索试试~ 我知道了~
androidCamera框架分析分享.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 46 浏览量
2022-01-31
16:11:35
上传
评论
收藏 123KB PDF 举报
温馨提示
试读
14页
androidCamera框架分析分享.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 类 的 对 象 , 但 由 于
剩余13页未读,继续阅读
资源评论
XWJcczq
- 粉丝: 1
- 资源: 8万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功