frameworks/base/libs/ui/中的Camera.cpp文件用于实现Camera.h提供的接口,其中一个重要的片断以下所示:java
const sp<ICameraService>& Camera::getCameraService() { Mutex::Autolock _l(mLock); if (mCameraService.get() == 0) { sp<IServiceManager> sm = defaultServiceManager(); sp<IBinder> binder; do { binder = sm->getService(String16("media.camera")); if (binder != 0) break; LOGW("CameraService not published, waiting..."); usleep(500000); // 0.5 s } while(true); if (mDeathNotifier == NULL) { mDeathNotifier = new DeathNotifier(); } binder->linkToDeath(mDeathNotifier); mCameraService = interface_cast<ICameraService>(binder); } LOGE_IF(mCameraService==0, "no CameraService!?"); return mCameraService; }其中最重要的一点是binder = sm->getService(String16("media.camera"));;这个调用用来获得一个名称为"media.camera" 的服务,这个调用返回值的类型为IBinder,根据实现将其转换成类型ICameraService使用。
一个函数 connect的实现 以下所示:函数
sp<Camera> Camera::connect() { sp<Camera> c = new Camera(); const sp<ICameraService>& cs = getCameraService(); if (cs != 0) { c->mCamera = cs->connect(c); } if (c->mCamera != 0) { c->mCamera->asBinder()->linkToDeath(c); c->mStatus = NO_ERROR; } return c; }connect经过调用getCameraService获得一个 ICameraService,再经过 ICameraService的cs->connect(c)获得一个 ICamera类型的指针。 调用connect将获得一个 Camera的指针,正常状况下Camera的成员 mCamera已经初始化完成。
一个具体的函数startPreview 以下所示:ui
status_t Camera::startPreview() { return mCamera->startPreview(); }这些操做能够直接对 mCamera来进行,它是ICamera类型的指针。
libmedia。so中的其余一些文件与头文件的名称相同,它们是:spa
frameworks/base/libs/ui/ICameraClient.cpp frameworks/base/libs/ui/ICamera.cpp frameworks/base/libs/ui/ICameraService.cpp在此处,BnCameraClient和BnCameraService类虽然实现了onTransact()函数,可是因为还有纯虚函数没有实现,所以这个类都是不能实例化的。
CameraService和CameraService::Client两个类的结果以下所示:指针
class CameraService : public BnCameraService { class Client : public BnCamera {}; wp<Client> mClient; }
在CameraService中的一个静态函数instantiate()用于初始化一个Camera服务,寒暑以下所示:code
void CameraService::instantiate() { defaultServiceManager()->addService( String16("media.camera"), new CameraService()); }事实上,CameraService:instantiate()这个函数注册了一个名称为"media。camera"的服务,这个服务和Camera。cpp中调用的名称相对应。
而这些Camera功能的具体实现,就是CameraService::Client所实现的了,其构造函数以下所示:继承
CameraService::Client::Client(const sp<CameraService>& cameraService, const sp<ICameraClient>& cameraClient) : mCameraService(cameraService), mCameraClient(cameraClient), mHardware(0) { mHardware = openCameraHardware(); mHasFrameCallback = false; }构造函数中,调用openCameraHardware()获得一个CameraHardwareInterface类型的指针,并做为其成员mHardware。之后对实际的Camera的操做都经过对这个指针进行。这是一个简单的直接调用关系。
CameraHardwareStub类的结构以下所示:接口
class CameraHardwareStub : public CameraHardwareInterface { class PreviewThread : public Thread { }; };