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 ...
随机推荐
- Razor小案例
Model using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ...
- 【Uva 1632】Alibaba
[Link]: [Description] 直线上有n(n≤10000)个点,其中第i个点的坐标是xi,且它会在di秒之后消失.Alibaba 可以从任意位置出发,求访问完所有点的最短时间.无解输出N ...
- TCP/IP图解学习总结(二)
注意:这里的第n层是依照OSI协议来的 I 网桥--2层交换机.数据链路层面上链接两个网络的设备.它可以识别数据链路层中的数据帧. II 路由器-3层交换机.网络层面上连接两个网络,并对分组报文 ...
- open阶段的一致性检验(二)
SQL> select * from v$version where rownum=1; BANNER --------------------------------------------- ...
- [LuoguU41039]PION后缀自动机 树链剖分+动态开点线段树
链接 刚开始看出题人题解都吓蒙掉了,还以为是什么难题,结果就一板子题 思路:对每一个文件名开一棵线段树,然后树剖即可 #include<bits/stdc++.h> #define REP ...
- 轻松学习Linux之用户账户管理及实例
Linux用户管理基础 (下载清晰视频:http://down.51cto.com/data/158699) 轻松学习Linux之用户账户管理的实例-跨硬盘移动数据 (此处视频不清楚下按下面地址下载清 ...
- 用硬件卡克隆Linux集群
650) this.width=650;" onclick="window.open("http://blog.51cto.com/viewpic.php?refimg= ...
- POJ 3009 Curling 2.0 {深度优先搜索}
原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...
- Objective-C - 类的静态常量
创建头文件(.h), 导出常量: // Constants.h FOUNDATION_EXPORT NSString *const MyFirstConstant; FOUNDATION_EXPORT ...
- 如何让Apache不显示服务器信息
如何让Apache不显示服务器信息 Apache的默认配置是会显示服务器信息的,比如访问一个服务器上不存在的页面,Apache会返回"Not Found"的错误,这个错误页面的最下 ...