完整讲解了android中camera的工作机制,代码分析。对了解整个android工作流程会有很大的帮助。
3.4Camera服务libcameraservice.so
frameworks/base/camera/libcameraservice/用于实现一个Camera的服务,这个服务是继承
ICameraService的具体实现。
在这里的Android.mk文件中,使用宏USE_CAMERA_STUB决定是否使用真的Camera,如果宏为真,则
使用CameraHardwareStub.cpp和FakeCamera.cpp构造一个假的Camera,如果为假则使用CameraService.cpp构造一个实际上的Camera服务。
CameraService.cpp是继承BnCameraService的实现,在这个类的内部又定义了类Client,
CameraService::Client继承了BnCamera。在运作的过程中CameraService::connect()函数用于得到一个CameraService::Client,在使用过程中,主要是通过调用这个类的接口来实现完成Camera的功能,由于CameraService::Client本身继承了BnCamera类,而BnCamera类是继承了ICamera,因此这个类是可以被当成ICamera来使用的。
CameraService和CameraService::Client两个类的结果如下所示:
classCameraService:publicBnCameraService{
classClient:publicBnCamera{};wp<Client>
}
在CameraService中的一个静态函数instantiate()用于初始化一个Camera服务,寒暑如下所示:
voidCameraService::instantiate(){
defaultServiceManager()->addService(String16("media.camera"),newCameraService());
}
事实上,CameraService::instantiate()这个函数注册了一个名称为"media.camera"的服务,这个
服务和Camera.cpp中调用的名称相对应。
Camera整个运作机制是:在Camera.cpp中可以调用ICameraService的接口,这时实际上调用的是
BpCameraService,而BpCameraService又通过Binder机制和BnCameraService实现两个进程的通讯。而BpCameraService的实现就是这里的CameraService。因此,Camera.cpp虽然是在另外一个进程中运行,但是调用ICameraService的接口就像直接调用一样,从connect()中可以得到一个ICamera类型的指针,真个指针的实现实际上是CameraService::Client。
而这些Camera功能的具体实现,就是CameraService::Client所实现的了,其构造函数如下所示:
mClient;
CameraService::Client::Client(constsp<CameraService>&cameraService,
constsp<ICameraClient>&cameraClient):
mCameraService(cameraService),mCameraClient(cameraClient),mHardware(0)
{
mHardware=openCameraHardware();mHasFrameCallback=false;
}
构造函数中,调用openCameraHardware()得到一个CameraHardwareInterface类型的指针,并作为
其成员mHardware。以后对实际的Camera的操作都通过对这个指针进行。这是一个简单的直接调用关系。
事实上,真正的Camera功能己通过实现CameraHardwareInterface类来完成。在这个库当中
CameraHardwareStub.h和CameraHardwareStub.cpp两个文件定义了一个桩模块的接口,在没有Camera硬件的情况下使用,例如在仿真器的情况下使用的文件就是CameraHardwareStub.cpp和它依赖的文件FakeCamera.cpp。
CameraHardwareStub类的结构如下所示: