完整讲解了android中camera的工作机制,代码分析。对了解整个android工作流程会有很大的帮助。
{
sp<ProcessState>proc(ProcessState::self());sp<IServiceManager>sm=defaultServiceManager();LOGI("ServiceManager:%p",sm.get());AudioFlinger::instantiate();
MediaPlayerService::instantiate();CameraService::instantiate();
ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();
}
当向ServiceManager注册了CameraService服务后就可以响应client的请求了2.client端向service发送请求
①.在java应用层调用onCreate()函数得到一个上层的Camera对象publicvoidonCreate(Bundleicicle){super.onCreate(icicle);
ThreadopenCameraThread=newThread(newRunnable(){publicvoidrun(){
mCameraDevice=android.hardware.Camera.open();
}
});
………………………}
②.通过Camera对象的调用成员函数,而这些成员函数会调用已向JNI注册过的native函数来调用ICamera接口的成员函数向BinderKernelDriver发送服务请求。
③.BinderKernelDriver接收到client的请求后,通过唤醒service的进程来处理client的请求,处理完后通过回调函数传回数据并通知上层处理已完成。三.Camera库文件分析
上面已提到Camera模块主要包含libandroid_runtime.so、libui.so、libcameraservice.so和一个与Camera硬件相关的底层库。其中libandroid_runtime.so、libui.so是与Android系统构架相关的不需要对其进行修改,libcameraservice.so和Camera硬件相关的底层库则是和硬件设备相关联的,而Canera硬件相关的底层库实际上就是设备的Linux驱动,所以Camera设备的系统集成主要通过移植CameraLinux驱动和修改libcameraservice.so库来完成。
libcameraservice.so库通过以下规则来构建:
构建规则略在上面的构建规则中可以看到使用了宏USE_CAMERA_STUB决定是否使用真的Camera,如果宏为真,则使用CameraHardwareStub.cpp和FakeCamera.cpp构造一个假的Camera,如果为假则使用libcamera来构造一个实际上的Camera服务。
在CameraHardwareStub.cpp中定义了CameraHardwareStub类,它继承并实现了抽象类CameraHardwareInterface中定义的真正操作Camera设备的所有的纯虚函数。通过openCameraHardware()将返回一个CameraHardwareInterface类的对象,但由于