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