Camera API1 从应用到CameraService分析

       文章根据这个整理而成。http://blog.chinaunix.net/uid-25314474-id-2938255.html。找到最后才发现上面介绍的Camera竟然是基于Android1.0写的文章,顿时泪奔,不过也能从中学到知识。可以通过    http://androidxref.com/  在线查看源码进行学习。

我6月4号写了大概,现在把native的binder看了一遍,再来缕下camera代码。  很多知识是从安卓框架揭秘看的。

写在前面的话android_hardware_Camera.cpp中的Camera调用Camera.cpp中的方法,然后Camera.cpp中先连接CameraService(用的是实名binder调用)。CameraService.cpp返回获取Icamera(这个是匿名Binder远程调用传递的),在Camera.cpp返回的ICamera远程调用CameraService::Client中的对应方法,然后CameraService::Client向下用hal打开驱动,在CameraService::Client中通过ICameraClient回调到Camera.cpp(这个也是匿名Binder调用)中,然后返回JNI,返回Camera.java到上层

其中涉及到三个Binder远程跨进程调用。三个接口ICameraClient,ICameraService,ICamera。

上层应用调用android/hardware/Camera.java

最上层的应用是packages/apps/Camera/src/com/android/camera/Camera.java.

android.hardware.Camera mCameraDevice;  //mCameraDevice通过CameraHolder.instance().open打开

frameworks/base/core/java/android/hardware/Camera.java

public class Camera {
    //在这个类当中,大部分代码使用JNI调用下层得到,例如:  
       public void setParameters(Parameters params) {
             native_setParameters(params.flatten());
       }  
       public final void setPreviewDisplay(SurfaceHolder holder) {
              setPreviewDisplay(holder.getSurface());
        } //两个setPreviewDisplay参数不同,后一个是本地方法,参数为Surface类型, 
        //前一个通过调用后一个实现,但自己的参数以SurfaceHolder为类型。  
        private native final void setPreviewDisplay(Surface surface); 
}  

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

这个类承上启下的作用,上层调用参数传递要经过这个类,参数设置结束,结果要通过此类返回给app. 先java调c++,然后在c++调java返回camera.java
这部分内容编译成为目标是libandroid_runtime.so
android_hardware_Camera.cpp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,如下所示

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++语言函数。
register_android_hardware_Camera 函数将gMethods注册为的类"android/media/Camera",其主要的实现如下所示
int register_android_hardware_Camera(JNIEnv *env) 
{   // Register native functions 
    return AndroidRuntime::registerNativeMethods(env, "android/hardware/Camera", 
                                              camMethods, NELEM(camMethods)); 
}

冻酸奶(Froyo)   2..2

/frameworks/base/include/camera/

Camera.h      CameraHardwareInterface.h   CameraParameters.h   ICamera.h   ICameraClient.h     ICameraService.h

/frameworks/base/libs/camera/ 这部分内容被编译成库libcamera_client.so</

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值