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硬件访问服务之框架的更多相关文章

  1. 2.Android硬件访问服务编写系统代码【转】

    本文转载自:https://blog.csdn.net/qq_33443989/article/details/76696772 版权声明:本文为博主(Tower)自学笔记,欢迎转载! :-)     ...

  2. 6.5 Android硬件访问服务使用反射

    1.前面的例子中App为了能够范问ILedService接口,把classes.jar导入到应用程序中,但是我们不想把classes编进apk包里面去,这样导致我们的apk程序会很大(解压缩apk会发 ...

  3. 6.4 Android硬件访问服务编写HAL代码

    JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...

  4. 6.2、Android硬件访问服务编写系统代码

    1.实现接口文件给App使用,接口文件是应用程序查询获得服务时获得 使用AIDL(Android接口定义语言)来实现ILedService.java接口 定义ILedService.aidl inte ...

  5. Android硬件访问服务中的HAL-查看打印的信息

    JNI  向上提供本地函数,向下加载HAL文件并调用HAL的函数 HAL 负责访问驱动程序执行硬件操作. external\chromium_org\third_party\hwcplus\src\h ...

  6. 6.3 Android硬件访问服务APP代码

    以下步骤是操作MainActivity类 1.导入包 import android.os.ILedService 2.添加成员变量 private ILedService iLedService = ...

  7. 硬件访问服务学习笔记_WDS

    1.Android驱动框架App1 App2 App3 App4-------------------硬件访问服务-------------------JNI-------------------C库 ...

  8. LED硬件访问服务(2)——JNI/HAL

    一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...

  9. android之硬件访问服务框架

    一.硬件接口描述文件aidl 新增\frameworks\base\core\java\android\os\ILedService.aidl 二.mk编译脚本 修改vi frameworks/bas ...

随机推荐

  1. Razor小案例

    Model using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ...

  2. 【Uva 1632】Alibaba

    [Link]: [Description] 直线上有n(n≤10000)个点,其中第i个点的坐标是xi,且它会在di秒之后消失.Alibaba 可以从任意位置出发,求访问完所有点的最短时间.无解输出N ...

  3. TCP/IP图解学习总结(二)

    注意:这里的第n层是依照OSI协议来的 I   网桥--2层交换机.数据链路层面上链接两个网络的设备.它可以识别数据链路层中的数据帧. II  路由器-3层交换机.网络层面上连接两个网络,并对分组报文 ...

  4. open阶段的一致性检验(二)

    SQL> select * from v$version where rownum=1; BANNER --------------------------------------------- ...

  5. [LuoguU41039]PION后缀自动机 树链剖分+动态开点线段树

    链接 刚开始看出题人题解都吓蒙掉了,还以为是什么难题,结果就一板子题 思路:对每一个文件名开一棵线段树,然后树剖即可 #include<bits/stdc++.h> #define REP ...

  6. 轻松学习Linux之用户账户管理及实例

    Linux用户管理基础 (下载清晰视频:http://down.51cto.com/data/158699) 轻松学习Linux之用户账户管理的实例-跨硬盘移动数据 (此处视频不清楚下按下面地址下载清 ...

  7. 用硬件卡克隆Linux集群

    650) this.width=650;" onclick="window.open("http://blog.51cto.com/viewpic.php?refimg= ...

  8. POJ 3009 Curling 2.0 {深度优先搜索}

    原题 $On Planet MM-21, after their Olympic games this year, curling is getting popular. But the rules ...

  9. Objective-C - 类的静态常量

    创建头文件(.h), 导出常量: // Constants.h FOUNDATION_EXPORT NSString *const MyFirstConstant; FOUNDATION_EXPORT ...

  10. 如何让Apache不显示服务器信息

    如何让Apache不显示服务器信息 Apache的默认配置是会显示服务器信息的,比如访问一个服务器上不存在的页面,Apache会返回"Not Found"的错误,这个错误页面的最下 ...