我试图更好地理解相机 native 代码的底层逻辑,但在寻找 Camera::connect()
的方法定义和从 Camera.h
声明的其他函数时,我似乎遇到了死胡同。
我遵循的步骤是:
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)
。 android_hardware_Camera_getCameraInfo(JNIEnv*, jobject, jint, jobject)
然后调用静态方法 Camera::getCameraInfo(jint, CameraInfo*)
,它似乎是通过以下方式声明的:#include <camera/Camera.h>
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
。然后看看
connect
。 connect
做了类似的工作,最后调用 CameraService::connect
。在该方法中,有一个由 CameraClient
初始化的 mModule
。因此,当您使用客户端执行某些操作时,您实际上是在使用特定于设备的实现。再说一句,mModule 是由
hw_get_module
中的 CameraService::onFirstRef
初始化的。关于android - 相机原生代码的底层逻辑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15863203/