我正在努力更好地理解相机本机代码的基本逻辑,但在查找Camera::connect()
的方法定义以及从Camera.h
声明的其他函数时,我似乎遇到了死胡同。
我遵循的步骤是:
Camera.java
中,其中包含解析摄像头的逻辑,在遇到时选择CameraInfo.CAMERA_FACING_BACK
:
Camera.open()
为Camera.getCameraInfo(int, CameraInfo)
中的每个int调用Camera.getNumberOfCameras()
。Camera.getCameraInfo(int, CameraInfo)
依次调用本机函数Camera._getCameraInfo(int, CameraInfo)
。Delving into the JNI:
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);
但是,方法体似乎没有在任何地方定义。
最后两个步骤是我感到困惑的地方。为更新版本的Android定义的camera/Camera.h
在哪里?最后,Camera
的方法体实际定义在哪里?
答案 0 :(得分:1)
似乎在Gingerbread之后,一些代码转移到了另一个框架。 I located camera/Camera.h
in the platform/frameworks/av
repository.
我找到了方法体in Camera.cpp
的定义。
答案 1 :(得分: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);
}
然后它抓取CameraService
的绑定对象并在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
初始化。