android - 相机原生代码底层逻辑

标签 android android-camera android-source

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

我遵循的步骤是:

  1. 在主分支中I located Camera.java ,其中包含解析相机的逻辑,选择 CameraInfo.CAMERA_FACING_BACK遇到时:
    • Camera.open()电话 Camera.getCameraInfo(int, CameraInfo)对于 Camera.getNumberOfCameras() 中的每个整数.
    • Camera.getCameraInfo(int, CameraInfo)依次调用 native 函数 Camera._getCameraInfo(int, CameraInfo) .
  2. 钻研 into the JNI :

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

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

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

最后两个步骤是我感到困惑的地方。 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 对象并调用 CameraService 上的 getCameraInfo

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。在该方法中,有一个由mModule 初始化的CameraClient。因此,当您使用客户端执行某些操作时,您实际上是在使用特定于设备的实现。

多说一句,mModule由CameraService::onFirstRef中的hw_get_module初始化。

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

相关文章:

java - 使用列的 IF 更新 SQLite (Android) 中的表

java - 将数组值添加到 Activity 中的 OnItemClickListener()

java - onPreviewFrame 返回倾斜的 YUV 数据

android - 从相机捕获图像并上传到 Firebase

Android 的 repo 工具因 python2 而失败

android - 如何更新 Android 中前台服务的通知文本?

java - MediaRecorder 停止在无效状态下调用 : 1

android - 从 ACTION_IMAGE_CAPTURE Intent 获取图像路径

android - 远程调试AOSP框架服务

android - 如何重新启动 VOLD 守护程序或向其发送命令?