完整讲解了android中camera的工作机制,代码分析。对了解整个android工作流程会有很大的帮助。
{"native_setup","(Ljava/lang/Object;)V",(void*)android_hardware_Camera_native_setup},{"native_release","()V",(void*)android_hardware_Camera_release},{"setPreviewDisplay","(Landroid/view/Surface;)V",(void*)android_hardware_Camera_setPreviewDisplay},
{"startPreview","()V",(void*)android_hardware_Camera_startPreview},{"stopPreview","()V",(void*)android_hardware_Camera_stopPreview},
{"setHasPreviewCallback","(Z)V",(void*)android_hardware_Camera_setHasPreviewCallback},{"native_autoFocus","()V",(void*)android_hardware_Camera_autoFocus},{"native_takePicture","()V",(void*)android_hardware_Camera_takePicture},
{"native_setParameters","(Ljava/lang/String;)V",(void*)android_hardware_Camera_setParameters},
{"native_getParameters","()Ljava/lang/String;",(void*)android_hardware_Camera_getParameters}
};
JNINativeMethod的第一个成员是一个字符串,表示了JAVA本地调用方法的名称,这个名称是在JAVA
程序中调用的名称;第二个成员也是一个字符串,表示JAVA本地调用方法的参数和返回值;第三个成员是JAVA本地调用方法对应的C语言函数。
register_android_hardware_Camera函数将gMethods注册为的类"android/media/Camera",其主要的
实现如下所示。
intregister_android_hardware_Camera(JNIEnv*env){
//Registernativefunctions
returnAndroidRuntime::registerNativeMethods(env,"android/hardware/Camera",
camMet
hods,NELEM(camMethods));}
"android/hardware/Camera"对应JAVA的类android.hardware.Camera。
3.3Camera本地库libui.so
frameworks/base/libs/ui/中的Camera.cpp文件用于实现Camera.h提供的接口,其中一个重要的片段
如下所示:
constsp<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("CameraServicenotpublished,waiting...");usleep(500000);//0.5s
}while(true);