相机本机代码的基本逻辑

时间:2013-04-07 13:58:02

标签: android android-camera android-source

我正在努力更好地理解相机本机代码的基本逻辑,但在查找Camera::connect()的方法定义以及从Camera.h声明的其他函数时,我似乎遇到了死胡同。

我遵循的步骤是:

  1. 在主分支I located Camera.java中,其中包含解析摄像头的逻辑,在遇到时选择CameraInfo.CAMERA_FACING_BACK
    • Camera.open()Camera.getCameraInfo(int, CameraInfo)中的每个int调用Camera.getNumberOfCameras()
    • Camera.getCameraInfo(int, CameraInfo)依次调用本机函数Camera._getCameraInfo(int, CameraInfo)
  2. Delving into the JNI

    • android_hardware_Camera_getCameraInfo(JNIEnv*, jobject, jint, jobject)然后调用静态方法Camera::getCameraInfo(jint, CameraInfo*),该方法似乎是通过以下方式声明的:

      #include <camera/Camera.h>
      
  3. 浏览和搜索主分支似乎没有给camera/Camera.h点击任何内容。我能找到的唯一结果是旧标签,例如in the gingerbread branch。这里只有一个方法声明:

    static  status_t    getCameraInfo(int cameraId,
                                  struct CameraInfo* cameraInfo);
    
  4. 但是,方法体似乎没有在任何地方定义。

  5. 最后两个步骤是我感到困惑的地方。为更新版本的Android定义的camera/Camera.h在哪里?最后,Camera的方法体实际定义在哪里?

2 个答案:

答案 0 :(得分:1)

似乎在Gingerbread之后,一些代码转移到了另一个框架。 I located camera/Camera.h in the platform/frameworks/av repository.

我找到了方法体in Camera.cpp的定义。

答案 1 :(得分:1)

在ICS中,Camera :: getCameraInfo(jint,CameraInfo *)在frameworks / av / camera / Camera.cpp中定义为

status_t Camera::getCameraInfo(int cameraId,
                               struct CameraInfo* cameraInfo) {
    const sp<ICameraService>& cs = getCameraService();
    if (cs == 0) return UNKNOWN_ERROR;
    return cs->getCameraInfo(cameraId, cameraInfo);
}

然后它抓取CameraService的绑定对象并在getCameraInfo上调用CameraService

status_t CameraService::getCameraInfo(int cameraId,
                                      struct CameraInfo* cameraInfo) {
    ...
    struct camera_info info;
    status_t rc = mModule->get_camera_info(cameraId, &info);
    ...
    return rc;
}

mModule包含设备上相机的实际实现。不同的设备可能有不同的实现。例如,您可以在hardware/qcom/camera/QualcommCamera.cpp下找到QualcommCamera

然后看看connectconnect执行类似的工作,最后调用CameraService::connect。在该方法中,CameraClient初始化了mModule。因此,当您对客户端执行某些操作时,您实际上正在使用特定于设备的实现。

还有一个词,mModule由hw_get_module中的CameraService::onFirstRef初始化。