camera.java中直接通过Jni调用c++层的方法到
android_hardware_camera.cpp
例如
->android_hardware_Camera_checkInputStatus
完了通过camera->checkInputStatus();
其中camera通过是camera的sp指针,通过get_native_camera得到
从而获得了一个camera对象
下面看一下camera类的实现
class Camera : public BnCameraClient, public IBinder::DeathRecipient
下面觉得有些变量已经有了填充,从新理一下
上面首先open直接调用,camera.java中的open方法
public static Camera open(int cameraId)
{
return new Camera(cameraId);
}
这个方法调用到构造函数中New了一个camera,传入cameraId
然后调到本类的方法
native_setup(new WeakReference(this), cameraId)
这个方法通过Jni调用到android_hardware_camera.cpp中的方法:
android_hardware_Camera_native_setup()
这里初始化了一个camera
sp camera = Camera::connect(cameraId);
调用camera类的connect方法传入cameraId
在camera.cpp中的connect()方法中
sp c = new Camera();
const sp& cs = getCameraService();
new了一个camera对象,然后获得media.camera的服务binder
const sp& cs = getCameraService();
c->mCamera= cs->connect(c,cameraId);------------------1
然后调用到cameraService中的connect方法
因为iCameraService中有connect方法,拿到的是cameraService的对象
因此调到了cameraService中的方法。
cameraService.cpp中的方法
p CameraService::connect(
const sp& cameraClient, int cameraId)
return client
其中client即为iCamera继承自BnCamera继承自iCamera的子类
后面调到camera.cpp中的
如startPreview方法,
status_t Camera::startPreview()
{
LOGV("startPreview");
sp c = mCamera;
if (c == 0) return NO_INIT;
return c->startPreview();
}
全部是调用的上1中返回的client中的方法。因为拿到的是client的对象.
然后把camera的对象c返回
下面分析上面cameraService.cpp中的connect方法
sp hardware = HAL_openCameraHardware(cameraId)
connect中new client把hardware传递给client类中的成员mHardware = hardware;
后面全部是用mHardware的方法,即下面的hardwareHal中的方法。
从这里拿到hardwareHal的对象下面调用的全部是hardwareHal中的方法。
如
status_t CameraService::Client::startPreviewMode()
mHardware->previewEnabled())
可以看出是用的hardwareHal中的方法。
至此framework中的camera架构已经解析完毕。
下面看hardware层中的camera的调用方式:
hardware中的架构比较简单一点没有那么绕,如果有时间就分析一下。
阅读(3280) | 评论(0) | 转发(0) |