Android中Camera架构

http://blog.chinaunix.net/uid-25677340-id-3072578.html


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<Camera>(this), cameraId)
这个方法通过Jni调用到android_hardware_camera.cpp中的方法:
android_hardware_Camera_native_setup()
这里初始化了一个camera
sp<Camera> camera = Camera::connect(cameraId);
调用camera类的connect方法传入cameraId
在camera.cpp中的connect()方法中
sp<Camera> c = new Camera();
const sp<ICameraService>& cs = getCameraService();
new了一个camera对象,然后获得media.camera的服务binder
const sp<ICameraService>& cs = getCameraService();
c->mCamera= cs->connect(c,cameraId);------------------1
然后调用到cameraService中的connect方法
因为iCameraService中有connect方法,拿到的是cameraService的对象
因此调到了cameraService中的方法。
cameraService.cpp中的方法
p<ICamera> CameraService::connect(
    const sp<ICameraClient>& cameraClient, int cameraId)
return client
其中client即为iCamera继承自BnCamera继承自iCamera的子类

后面调到camera.cpp中的

如startPreview方法,

status_t Camera::startPreview()
{
LOGV("startPreview");
sp <ICamera> c = mCamera;
if (c == 0) return NO_INIT;
return c->startPreview();
}

全部是调用的上1中返回的client中的方法。因为拿到的是client的对象.

然后把camera的对象c返回


下面分析上面cameraService.cpp中的connect方法
sp<CameraHardwareInterface> 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中的架构比较简单一点没有那么绕,如果有时间就分析一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值