我试图更好地理解相机 native 代码的底层逻辑,但在寻找 Camera::connect() 的方法定义和从 Camera.h 声明的其他函数时,我似乎遇到了死胡同。

我遵循的步骤是:

  • 在主分支 I located Camera.java 中,包含解析camera的逻辑,遇到时选择CameraInfo.CAMERA_FACING_BACK:
  • Camera.open()Camera.getCameraInfo(int, CameraInfo) 中的每个 int 调用 Camera.getNumberOfCameras()
  • Camera.getCameraInfo(int, CameraInfo) 依次调用 native 函数 Camera._getCameraInfo(int, CameraInfo)
  • 探索 into the JNI :
  • android_hardware_Camera_getCameraInfo(JNIEnv*, jobject, jint, jobject) 然后调用静态方法 Camera::getCameraInfo(jint, CameraInfo*) ,它似乎是通过以下方式声明的:
    #include <camera/Camera.h>
    
  • 浏览和搜索 master 分支似乎对 camera/Camera.h 没有任何影响。我能找到的唯一结果是旧标签,例如 in the gingerbread branch 。这里只有一个方法声明:
    static  status_t    getCameraInfo(int cameraId,
                                  struct CameraInfo* cameraInfo);
    
  • 但是,方法体似乎没有在任何地方定义。

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

    最佳答案

    在 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 的 binder 对象并调用 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 初始化的。

    关于android - 相机原生代码的底层逻辑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15863203/

    10-11 00:44