Camera2框架从Java层到C++层类关系

移动开发 waitig 810℃ 百度已收录 0评论

转自:http://blog.csdn.net/hejjunlin/article/details/53138945

 

Agenda:

  • getSystemService(Context.CAMERA_SERVICE)
  • CameraManager.getCameraIdList()
  • ICameraService.aidl
  • ICameraService.cpp

这里写图片描述

camera2中从Java层到C++层,以获取摄像头数目为例。
1.当我们获取摄像头时,会调用  CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); 而在最早的Camera类中,是通过openCamera,传到jni中android_hardware_Camera.cpp的openCamera,再向下到达Camera.cpp中,而在Camera2中,换了一种形式,通过getSystemService方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。这里传入的是Context.CAMERA_SERVICE

这里写图片描述

这里写图片描述

android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,相应的名字会注册到SystemServer中,当外部须要用到这些服务时,就会通过getSystemService(xxx.name)获取对应的服务。

 

传入的Name返回的对象说明
WINDOW_SERVICEWindowManager管理打开的窗口程序
LAYOUT_INFLATER_SERVICELayoutInflater取得xml里定义的view
ACTIVITY_SERVICEActivityManager管理应用程序的系统状态
POWER_SERVICEPowerManger电源的服务
ALARM_SERVICEAlarmManager闹钟的服务
NOTIFICATION_SERVICENotificationManager状态栏的服务
KEYGUARD_SERVICEKeyguardManager键盘锁的服务
LOCATION_SERVICELocationManager位置的服务,如GPS
SEARCH_SERVICESearchManager搜索的服务
VEBRATOR_SERVICEVebrator手机震动的服务
CONNECTIVITY_SERVICEConnectivity网络连接的服务
WIFI_SERVICEWifiManagerWi-Fi服务
TELEPHONY_SERVICETeleponyManager电话服务

 

当通过getSystemService(Context.CAMERA_SERVICE)获取到CameraManager后,通过调用anager.getCameraIdList()方法,获取到可用的摄像头列表。

这里写图片描述

再看下getOrCreateDeviceIdListLocked方法,返加的是list

这里写图片描述

看下CameraManagerGlobal.get().getCameraService()方法,

这里写图片描述

下面开始连接Camera相关服务

这里写图片描述

以上代码总结为当把mCameraService返回到getCameraService,这样就建立了C/S模型,Service是实际背后操作者,他们通信就是binder,这样整个过程就清楚了。

接下来看下这个ICameraService.aidl,位于frameworks\base\core\java\android\hardware下

这里写图片描述

以上就有一个getNumberOfCameras,获取对应的摄像头是多少个。通过onTransact,最后来到ICameraService.cpp中,位于\frameworks\av\camera包下

这里写图片描述
这里写图片描述
这里写图片描述

这样一个从java到c++层过程就完成了,后面的过程就是c++中进行。后面继续分析。

 


本文由【waitig】发表在等英博客
本文固定链接:Camera2框架从Java层到C++层类关系
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)