我是吃货 发表于 2022-7-20 17:38:10

嵌入式Android底层开发(三)硬件访问服务框架

本帖最后由 我是吃货 于 2022-7-20 17:39 编辑

一、简单的Android应用程序调用硬件流程图(通过JNI接口直接访问)


但这样存在一个很大的问题:访问仅限与单一程序进行访问,如果多个APP同时访问一个硬件资源(多个APP都需要在LCD进行显示、多个APP想要播放音乐)
如何解决?添加一层SystemServer,SystemServer作为APP的选择器,提供仲裁


二、Android的硬件访问服务框架
上面提出了SystemServer,而在Android中SystemServer是使用JAVA编写,这就意味着SystemServer执行完成后依然需要经过JNI接口。下面是Android的硬件访问服务框架流程图。

尤其要注意的是

第三步的注册本地方法:此处是调用各个硬件的函数注册本地方法,同时此处的JNI文件为C语言编写,可以直接访问硬件,如果硬件后期改动不大,可以直接在JNI中调用硬件寄存器,如果硬件驱动部分需要修改,则最好建立一个HAL(硬件抽象层)用来将JNI与硬件驱动分开。

HAL层设立的原因:
1、易于修改,如果JNI发生变动需要重新烧录整个系统,如果HAL变动则只需烧录HAL层。
2、保密,许多公司并不愿意开放硬件驱动程序,会选择将自己的文件更多的放入到HAL层。

第五步添加服务:1、需要根据本地的方法来创建服务。2、向系统管理线程添加服务

第六步为APP(JAVA)提供服务

第七步APP(JAVA)调用硬件接口


三、Android硬件访问服务的总结(以LED为例)
第一步、创建一个JNI和HAL
实现功能:
JNI:需要编写一个com_androidd_server_LedService.cpp,用于注册JNI本地方法
HAL:hal_led.c,用于调用led_open,led_write,led_read
led_JNI------加载-----》led_HAL

第二步、修改onload.cpp
实现功能:
使onload.cpp调用com_androidd_server_LedService.cpp

第三步、修改SystemServer.java
实现功能:
1、实现一个LED服务(LedService)
2、向System_manager.c添加LED服务(LedService)

第四步、建立LedService.java
实现功能:可以调用本地方法,实现硬件操作

第五步、建立ILedService.java
实现功能:给APP(Android)提供调用接口


页: [1]
查看完整版本: 嵌入式Android底层开发(三)硬件访问服务框架