android_hardware_Camera_native_setup,此函数调用了sp<Camera> camera = Camera::connect(cameraId),这里的camera对象可不是应用层Camera.java文件中的camera对象,这里处于cpp文件中,所以,不可能是java文件中对象。这里camera对象的声明位于frameworks/base/include/camera/Camera.h文件中,其一个基BnCameraClient,Bnxx是binder机制C++空间的服务端接口,其定义于同一文件夹下的ICameraClient.h中。camera对象的实现位于frameworks/base/libs/camera/Camera.cpp,Camera::connect接口创建了一个Camera实例,并使用标准的binder机制获得了CameraService的远程代理类,并使用CameraService的远程代理类调用CameraService的connect接口,从此调用流程进入了Cameraservics,下面介绍Cameraservics的启动过程。
Cameraservics是使用native方法启动的,使用init.rc启动的,而不是使用android的system_service启动的。启动Cameraservics的服务在init.rc叫media,其位于frameworks/base/media/mediaserver/main_mediaserver.cpp中,在此中创建了一个Cameraservics对象,并将Cameraservics注册到系统的servics中。Cameraservics定义于frameworks/base/services/camera/libcameraservice中,我们首先看看CameraService.h文件,Cameraservics继承于BnCameraService,由此可知Cameraservics类是摄像头服务类的实现,也即是camera的系统服务。
在Cameraservics类中还定义了一个重要的内部类class Client,其继承于public BnCamera,BnCamera定义于frameworks/base/include/camera/ICamera.h,这里也是binder的机制,内部类Client也是一种服务的实现。在Cameraservics类的初始化的时候会调用onFirstRef(),在onFirstRef()中使用android hal层的标准函数hw_get_module()获得camera的hal层的hw_module_t对象,并赋值给mModule,这样就可以通过hal层调用linux驱动了,虽然这里得到了hw_module_t对象,但是调用hal的具体操作并不在Cameraservics中,而是由Cameraservics调用CameraHardwareInterface的接口,再由CameraHardwareInterface调用hal层,CameraHardwareInterface定义于frameworks/base/services/camera/libcameraservice/CameraHardwareInterface.h中。
Cameraservics服务启动了,我们继续open的调用流程,前面说到调用了Cameraservics的connect接口,connect接口里创建了两个重要的对象:class client, CameraHardwareInterface,并返回client对象,这个对象很重要。
下面来说startPreview的流程,首先是frameworks/base/core/java/android/hardware/Camera.java的startPreview函数,它是jni实现的,位于frameworks/base/core/jni/android_hardware_Camera.cpp,jni中的startPreview调用frameworks/base/libs/camera/Camera.cpp中的startPreview,startPreview通过binder机制调用定义于Cameraservics中内部类client类中的startPreview,client的startPreview函数调用startCameraMode,startCameraMode调用startPreviewMode,startPreviewMode调用CameraHardwareInterface中的startPreview,我们去CameraHardwareInterface.h去看看:mDevice->ops->start_preview(mDevice),其中mDevice 是hw_device_t的类型,到这里,startPreview的调用就进入了camera的hal层了,这里对hal层不进行分析。