4

我试图更好地理解相机本机代码的底层逻辑,但在寻找方法定义Camera::connect()和其他从Camera.h.

我遵循的步骤如下:

  1. 在我所在Camera.java的主分支中,其中包含解析摄像机的逻辑,CameraInfo.CAMERA_FACING_BACK在遇到时选择:
    • Camera.open()调用Camera.getCameraInfo(int, CameraInfo)中的每个 int Camera.getNumberOfCameras()
    • Camera.getCameraInfo(int, CameraInfo)依次调用本机函数Camera._getCameraInfo(int, CameraInfo)
  2. 深入研究 JNI

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

      #include <camera/Camera.h>
      
  3. 浏览和搜索 master 分支似乎对camera/Camera.h. 我能找到的唯一结果是在旧标签中,例如在姜饼分支中。这里只有一个方法声明:

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

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

4

2 回答 2

1

似乎在 Gingerbread 之后,一些代码转移到了不同​​的框架。我位于camera/Camera.h存储platform/frameworks/av库中。

Camera.cpp.

于 2013-04-07T14:00:45.623 回答
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);
}

然后它抓取一个 binder 对象CameraService并调用getCameraInfoon 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实际实现。不同的设备可能有不同的实现。例如,您可以QualcommCamerahardware/qcom/camera/QualcommCamera.cpp下找到。

然后看看connectconnect做类似的工作,最后调用CameraService::connect. 在该方法中,有一个CameraClientmModule. 因此,当您对客户端执行某些操作时,您实际上是在使用特定于设备的实现。

再说一句,mModule 由hw_get_modulein初始化CameraService::onFirstRef

于 2013-04-09T04:17:35.647 回答