6.1、Android硬件访问服务之框架
1、通过前面led点亮的例子,其流程如下
Android app(java)(通过loadLibrary)——>C library(C库做如下事情)——>1、JNI_Onload
2、jniRegisterNativeMethods
3、ledOpen、ledClose、ledCtrol
4、open、close、ioctl
5、Hardware driver
6、Hardware
这种应用程序通过本地接口来直接访问我们的硬件称为使用JNI接口来直接访问,如果有多个应用程序来访问,可能存在冲突。(这种方式基本上只有我们自己写的应用可以访问硬件,对于比较独特私有的硬件可以使用这种方式)。
另外一种方式是通过SystemServer硬件访问服务来统一管理,App仅将请求发送给该服务,有硬件访问服务使用Java写的,其通过JNI接口来访问硬件。
(Server指的是服务器,其提供各种硬件Service)
硬件访问服务所做的工作:
A、loadLibrary:加载C库
B、JNI_Onload:注册本地方法
分别调用各个硬件(LED/振动器/串口/屏幕等)的函数来注册本地方法
eg:register_android_server_PowerMangerService(env);等,具体的可以分析SystemServer.java
电源管理硬件的注册服务函数在com_android_server_PowerMangerService.cpp;其他的都类似
在各个硬件的注册函数里面就是调用jniRegisterNativeMethods来注册
C、SystemServer:对每个硬件使用本地方法来构造Service,然后addService
addService是SystemServer进程向service_manager进程注册,后面App应用程序进程是向service_manager进程查询获取服务,这里进程间通信是通过binder来实现通信的
D、APP应用怎么使用:获得服务(getService)、使用服务(执行Service的方法(上面注册的本地方法))
说明:这里的com_android_server_PowerMangerService.cpp就被称为JNI文件,其是用C++实现的,可以直接在里面调用open,close等系统调用来范问驱动程序,但是一般不这样做,对于复制的驱动程序,一般把open、close等系统调用写在HAL文件中,这样做如果我们修改了硬件操作,只需要编译新的so库,把其放到系统中就可以,其次硬件公司出于保密,只愿意提供HAL层的库so文件,应用层通过JNI来访问HAL库
怎么实现硬件访问服务?(举例添加led硬件服务)
A、实现JNI和HAL
com_android_server_LedService.cpp注册JNI本地方法
实现hal_led.c:里面调用open,read等系统调用访问硬件
在JNI文件中加载hal_led.c
B、修改onload.cpp调用com_android_server_LedService.cpp实现的函数
C 、实现LedService.java调用本地方法
D、修改SystemServer.java:
new LedService()
addService
E、实现ILedService.java接口给App使用

6.1、Android硬件访问服务之框架的更多相关文章
- 2.Android硬件访问服务编写系统代码【转】
本文转载自:https://blog.csdn.net/qq_33443989/article/details/76696772 版权声明:本文为博主(Tower)自学笔记,欢迎转载! :-) ...
- 6.5 Android硬件访问服务使用反射
1.前面的例子中App为了能够范问ILedService接口,把classes.jar导入到应用程序中,但是我们不想把classes编进apk包里面去,这样导致我们的apk程序会很大(解压缩apk会发 ...
- 6.4 Android硬件访问服务编写HAL代码
JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...
- 6.2、Android硬件访问服务编写系统代码
1.实现接口文件给App使用,接口文件是应用程序查询获得服务时获得 使用AIDL(Android接口定义语言)来实现ILedService.java接口 定义ILedService.aidl inte ...
- Android硬件访问服务中的HAL-查看打印的信息
JNI 向上提供本地函数,向下加载HAL文件并调用HAL的函数 HAL 负责访问驱动程序执行硬件操作. external\chromium_org\third_party\hwcplus\src\h ...
- 6.3 Android硬件访问服务APP代码
以下步骤是操作MainActivity类 1.导入包 import android.os.ILedService 2.添加成员变量 private ILedService iLedService = ...
- 硬件访问服务学习笔记_WDS
1.Android驱动框架App1 App2 App3 App4-------------------硬件访问服务-------------------JNI-------------------C库 ...
- LED硬件访问服务(2)——JNI/HAL
一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...
- android之硬件访问服务框架
一.硬件接口描述文件aidl 新增\frameworks\base\core\java\android\os\ILedService.aidl 二.mk编译脚本 修改vi frameworks/bas ...
随机推荐
- jQuery源码05 (3653 , 3797) queue() : 队列方法 : 执行顺序的管理
//对外接口 jQuery.extend({ queue: function( elem, type, data ) {//入队.元素.队列名字.存进去的函数 //jQuery.queue( this ...
- jQuery源码04 data() : 数据缓存
/* Implementation Summary 1. Enforce API surface and semantic compatibility with 1.9.x branch 2. Imp ...
- tensorflow 语法及 api 使用细节
1. tf.nn.conv2d 的参数 padding='SAME' ⇒ 卷积之前的大小和卷积之后的大小一致,默认使用全 0 填充: padding='VALID' ⇒ 也即仅适用其有效部分,而不使用 ...
- express中的中间件理解
什么是中间件 中间件是一个可访问请求对象(req)和响应对象(res)的函数,在 Express 应用的请求-响应循环里,下一个内联的中间件通常用变量 next 表示.中间件的功能包括: 执行任何代码 ...
- css选择器和优先级总结
本文转自http://www.cnblogs.com/zxjwlh/p/6213239.html CSS三大特性—— 继承. 优先级和层叠. 继承:即子类元素继承父类的样式; 优先级:是指不同类别样式 ...
- 10.cocos2d坐标系
一.笛卡儿坐标系 OpenGl坐标系为笛卡儿右手系.x向右,y向上,z向外.在cocos2d-lua中坐标系原点在屏幕的左下角,x向右,y向上,z则是指的zorder(层级). 二.世界坐标系,本地坐 ...
- Mahout的推荐系统
Mahout的推荐系统 什么是推荐系统 为什使用推荐系统 推荐系统中的算法 什么是推荐系统 为什么使用推荐系统? 促进厂商商品销售,帮助用户找到想要的商品 推荐系统无处不在,体现在生活的各个方面 图书 ...
- javaweb一
JavaWeb就是在服务器端以Java语言为解释运行基础的web程序. php代码要想在服务器端运行,需要在服务器软件(通常是Apache)上加php的解释器,Java也一样,但是这个解释器是Tomc ...
- Codefroces B. New Skateboard
B. New Skateboard time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- Standalone 集群部署
Spark中调度其实是分为两个层级的,即集群层级的资源分配和任务调度,以及任务层级的任务管理.其中集群层级调度是可配置的,Spark目前提供了Local,Standalone,YARN,Mesos.任 ...