Camera 相关代码分析

一、Camera概述
    
    1、Camera的JAVA程序的路径:
        packages/apps/Camera/src/com/android/camera/
        其中Camera.java是主要实现的文件
        frameworks/base/core/java/android/hardware/Camera.java
       这个类是和JNI中定义的类是一个,有些方法通过JNI的方式调用本地代码得到,有些方法自己实
       现。
 
    2、Camera的JAVA本地调用部分(JNI):
        frameworks/base/core/jni/android_hardware_Camera.cpp
        主要的头文件在以下的目录中:
        frameworks/base/include/ui/
 
        这部分内容编译成为目标是libandroid_runtime.so。
 
    3、Camera底层库在以下的目录中:
        frameworks/base/libs/ui/
        这部分的内容被编译成库libui.so。
 
    4、Camera服务部分:
        frameworks/base/camera/libcameraservice/ 
        这部分内容被编译成库libcameraservice.so。
 
    5、Camera硬件接口层
        frameworks/base/include/ui/CameraHardwareInterface.h
        为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用 
        video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库
        libcameraservice.so调用。
 
二、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工作流程概述
 
   1、App_main process: 
      进程通过AndroidRuntime调用register_jni_procs向JNI注册模块的native函数供JVM调用。
         AndroidRuntime::registerNativeMethods(env, "android/hardware/Camera",
                                           camMethods,NELEM(camMethods));
   2、Mediaserver proces:
      进程注册了以下几个server: AudioFlinger、 MediaPlayerServer、CameraService。 
 
 
 
 
网友评论
内容:
前辈,你好,我在linux下已经移植成功摄像头,但是现在不知道如何把摄像头移植到android上,我的思路是修改hardware下的HAL的接口,不知道是这样吗?能给出些思路吗?谢谢

Blog作者的回复:
在linux下的驱动支持标准的V4L2 capture接口,然后需要在android增加一个libcamera.xxx.so的库,Android启动时自动加载。你在网上找一个libcamera.so的例子,照着格式修改一下就可以的。

吖亮评论于:2010-11-08 18:03:56 (121.32.17.★)
内容:
好的,谢谢,我现在参照hardware/msm7k/libcamera,应该没问题吧?
吖亮评论于:2010-11-09 10:22:41 (121.32.115.★)
 
posted @ 2011-02-28 19:22  SimonShi  阅读(2971)  评论(0编辑  收藏  举报