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 ...
随机推荐
- 下载安装与配置Excel 2013数据挖掘加载项(SQL Server 2012 SP1 + SQLServer2012_DMAddin.msi)
一.系统要求 在安装这个数据挖掘加载项前,你的机器必须要可以支持如下的相关系统设备: (1)操作系统:windows 7 和 windows 8,暂时不支持 windows 10. (2)excel ...
- AIX lsof 命令
1.查看某端口运行情况 如查看22端口运行情况 # lsof –i:22 # lsof –i:22 –r ----每隔15秒显示22端口的监听情况. 2.查看活动的连接 如:查看ip地址为19 ...
- spring bean中的properties元素内的ref和value的区别;* 和 ** 的区别
spring bean中的properties元素内的ref和value的区别 至于使用哪个是依据你所用的属性类型决定的. <bean id="sqlSessionFactory&qu ...
- POJ 4047 Garden
Garden Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 404 ...
- android 自己定义控件属性(TypedArray以及attrs解释)
近期在捣鼓android 自己定义控件属性,学到了TypedArray以及attrs.在这当中看了一篇大神博客Android 深入理解Android中的自己定义属性.我就更加深入学习力一番.我就沿着这 ...
- google 分屏 横屏模式 按home键界面错乱故障分析(二) 分屏的启动过程
google 进入分屏后在横屏模式按home键界面错乱(二) 你确定你了解分屏的整个流程? imageMogr2/auto-orient/strip%7CimageView2/2/w/1240&quo ...
- Oracle APEX 4.2公布RESTful Webservice
Purpose This tutorial covers creating a RESTful Web Service and accessing the Web Service through an ...
- js34
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- Eclipse&STS常用小技巧
开发是经常用到的代码可进行快捷提示,比如mian alt+/就提示出了main方法是不是很方便,为什么就能提示出来呢? 马上来了: 在你使用的java开发工具中点击Window--->Prefe ...
- 为您的Office文档加把锁-ADRMS的安装
为您的Office文档加把锁-ADRMS的安装 如今不少企业越来越重视自己KM(知识管理系统)的建立对于KM的建立实施虽然可以有效地解决企业在知识管理上的问题对于一些具有商业利益关系的机密文件(例如: ...