收藏官网首页
查看: 4608|回复: 0

[技术分享] 嵌入式Android底层开发(三)硬件访问服务框架

77

主题

89

帖子

1938

积分

金牌会员

Rank: 6Rank: 6

积分
1938
 楼主| 发表于 2022-7-20 17:38:10 | 显示全部楼层 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
本帖最后由 我是吃货 于 2022-7-20 17:39 编辑

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

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

20210614151257571.png
二、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)调用硬件接口
20210615171114830.png

三、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)提供调用接口


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表