HIDL最全编译流程

2023-05-16

想了解HIDL介绍的可以参考《HIDL概述》,本篇文章主要介绍HIDL的详细编译流程及简单的客户端应用(C++跟Android客户端的应用)。

一、准备工作

  1. 整一套源码,Android O或者Android P的
  2. 保证全套代码已经全编译,原生代码全编译命令
  • source build/envset.sh
  • lunch
  • make

   3、hidl-gen工具已经安装,安装命令

  • make hidl-gen 

二、hidl-gen工具介绍

系统定义的所有的.hal接口,都是通过hidl-gen工具转换成对应的代码。hidl-gen源码路径:system/tools/hidl,是在ubuntu上可执行的二进制文件。

使用方法:hidl-gen -o output-path -L language (-r interface-root) fqname

例子:

      hidl-gen -o hardware/interfaces/gunder/1.0/default/ -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.gunder@1.0

参数说明:

  • -L 语言类型,包括c++, c++-headers, c++-sources, export-header, c++-impl, java, java-constants, vts, makefile, androidbp, androidbp-impl, hash等。hidl-gen可根据传入的语言类型产生不同的文件。
  • fqname 完全限定名称的输入文件。比如本例中android.hardware.gunder@1.0,要求在源码目录下必须有hardware/interfaces/ gunder /1.0/目录。对于单个文件来说,格式如下:package@version::fileName,比如android.hardware. gunder @1.0::types.Feature。对于目录来说。格式如下package@version比如android.hardware. gunder @1.0
  • -r 格式package:path,可选,对fqname对应的文件来说,用来指定包名和文件所在的目录到Android系统源码根目录的路径。如果没有制定,前缀默认是:android.hardware,目录是Android源码的根目录。
  • -o:存放hidl-gen产生的中间文件的路径。

可以使用hidl-gen 查看帮助,如图1:

                                                                          图1  hidl-gen的帮助信息

三、项目实例

1、在hardware/interfaces/目录下新建gunder/1.0目录,并在1.0目录中创建接口IGunder.hal。目录结构如下:

gunder@ubuntu-MX8:~ /IMX8_b0beta2/hardware/interfaces/gunder$ tree

.

└── 1.0

    └── IGunder.hal

IGunder.hal文件里面只有一个接口IGunder和一个方法helloWorld(string name),具体实现如下:

package android.hardware.gunder@1.0;

interface IGunder{
	helloWorld(string name) generates (string result);
};

 

 

 

 

         2、执行下面三条命令会自动生成对应的c++文件;

  • PACKAGE=android.hardware.gunder@1.0
  • LOC=hardware/interfaces/gunder/1.0/default/
  • hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

执行命令后的目录结构如下:

gunder@ubuntu-MX8:~ /IMX8_b0beta2$ PACKAGE=android.hardware.gunder@1.0

gunder@ubuntu-MX8:~ /IMX8_b0beta2$ LOC=hardware/interfaces/gunder/1.0/default/

gunder@ubuntu-MX8:~ /IMX8_b0beta2$ hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

gunder@ubuntu-MX8:~ /IMX8_b0beta2/hardware/interfaces/gunder$ tree

.

└── 1.0

    ├── default

    │   ├── Gunder.cpp

    │   └── Gunder.h

    └── IGunder.hal

default 是新生成的目录,Gunder.cpp和Gunder.h是新生成的两个文件,打开Gunder.h文件,去掉// extern "C" IGunder* HIDL_FETCH_IGunder(const char* name);前面的注释,使用直通式HAL(Passthrough 模式)来通信。Gunder.h文件修改后如图2:

                                                           图2 Gunder.h修改后的内容

Gunder.cpp文件也要进行对应的修改,修改后如如图3:

                                                                   图3  Gunder.cpp修改后的内容

3、执行下面命令

  • hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

会在hardware/interfaces/gunder/1.0/default目录生成Android.bp文件。

gunder@ubuntu-MX8:~ /IMX8_b0beta2/hardware/interfaces/gunder$ tree

.

└── 1.0

    ├── default

    │   ├── Android.bp

    │   ├── Gunder.cpp

    │   └── Gunder.h

└── IGunder.hal

4、然后使用脚本update-makefiles.sh来更新Makefile,自动在hardware/interfaces/gunder/1.0目录生成Android,mk Android.bphardware/interfaces/gunder目录生成Android.bp。命令如下

  • ./hardware/interfaces/update-makefiles.sh

执行完命令后目录结构如下:

gunder@ubuntu-MX8:~/IMX8_b0beta2$ ./hardware/interfaces/update-makefiles.sh

gunder@ubuntu-MX8:~/IMX8_b0beta2/hardware/interfaces/gunder$ tree

.

├── 1.0

│   ├── Android.bp

│   ├── Android.mk

│   ├── default

│   │   ├── Android.bp

│   │   ├── Gunder.cpp

│   │   └── Gunder.h

│   └── IGunder.hal

└── Android.bp

 

5、在hardware/interfaces/gunder/1.0/default目录下新建service.cpp跟android.hardware.gunder@1.0-service.rc,其中android.hardware.gunder@1.0-service.rc是程序的入口函数。新的目录结构如下:

.

├── 1.0

│   ├── Android.bp

│   ├── Android.mk

│   ├── default

│   │   ├── Android.bp

│   │   ├── android.hardware.gunder@1.0-service.rc

│   │   ├── Gunder.cpp

│   │   ├── Gunder.h

│   │   └── service.cpp

│   └── IGunder.hal

└── Android.bp

android.hardware.gunder@1.0-service.rc的实现如图:

service.cpp的实现如图:

打开hardware/interfaces/gunder/1.0/default目录下的Android.bp,添加编译service.cpp成为可执行文件的代码。具体添加内容如下:

到此跟HAL相关的代码就实现完了。

 

6、编译生成服务端跟客户端要用各种库文件。首先执行下面两条命令

  • ./hardware/interfaces/update-makefiles.sh
  • mmm hardware/interfaces/gunder/1.0/

执行后会生成下面的文件:

out/target/product/mek_8q/system/lib64/android.hardware.gunder@1.0.so

out/target/product/mek_8q/vendor/lib64/hw/android.hardware.gunder@1.0-impl.so

out/target/product/mek_8q/vendor/etc/init/android.hardware.gunder@1.0-service.rc

        

7、manifest文件里添加vendor接口的定义编译device/fsl/mek_8q/manifest.xml文件(不同厂家路径可能不一样),添加以下内容,不然在client端是没法拿到service的。如下:

        

8、使用C++实现客户端调用

在hardware/interfaces/gunder/1.0目录下新建test目录,并且在test目录下新建Android.bp跟GunderTest.cpp文件,这两个文件的内容如下:

GunderTest.cpp:

Android.bp:

 

执行以下命令:

  • ./hardware/interfaces/update-makefiles.sh
  • mmm hardware/interfaces/gunder/1.0/

执行第一条命令是为了更新hardware/interfaces/gunder/目录下的Android.bp文件,如下:

执行第二条命令会生成可执行文件:

out/target/product/mek_8q/vendor/bin/hw/gunder_client

 

9、使用JAVA实现客户端调用

 为了方便eclipse或者Android Studio调用接口函数,需要编译出classes.jar包。但是jack编译出来的文件是classes.jack。如图:

为了编译出classes.jar,需要打开hardware/interfaces/gunder/1.0目录的Android.mk,在include $(CLEAR_VARS)下面添加LOCAL_JACK_ENABLED := disabled。这样编译的时候就不走jack编译了。如下:

 

执行下面命令

  • mmm hardware/interfaces/gunder/1.0/

执行完后生成了classes.jar。如图:

新建Android项目HIDLdemo,将classes.jar导入项目,MainActivity代码实现如下:

 

添加Android.mk文件,然后将项目放到packages/apps/进行编译。Android.mk文件内容如下:

执行命令

  • mmm packages/apps/HIDLdemo

会生成out/target/product/mek_8q/system/app/HIDLdemo/HIDLdemo.apk

         10、测试客户端程序

                  执行下列命令:

  • adb push X:\IMX8_b0beta2\out\target\product\mek_8q\vendor\lib64\hw\android.hardware.gunder@1.0-impl.so  /vendor/lib64/hw
  • adb push X:\IMX8_b0beta2\out\target\product\mek_8q\system\lib64\android.hardware.gunder@1.0.so /system/lib64
  • adb push X:\IMX8_b0beta2\out\target\product\mek_8q\vendor\bin\hw\gunder_client /vendor/bin/hw
  • adb push X:\IMX8_b0beta2\out\target\product\mek_8q\vendor\bin\hw\android.hardware.gunder@1.0-service /vendor/bin/hw
  • adb push X:\IMX8_b0beta2\device\fsl\evk_8mq\manifest.xml /vendor
  • adb install -r X:\IMX8_b0beta2\out\target\product\ mek_8q \system\app\HIDLdemo\HIDLdemo.apk

上面的命令是将需要的文件push到系统,方便调试。

C++客户端调试:

先启动./android.hardware.gunder@1.0-service服务,然后启动gunder_client程序,执行结果如下:

 

Android客户端执行:

先启动./android.hardware.gunder@1.0-service服务,然后通过命令拉起MainActivity界面

adb shell am start -n com.example.ytkj.hidldemo/.MainActivity,执行结果如下:

 

代码参考:https://github.com/gunder1129/android-tool/tree/master/HIDL

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HIDL最全编译流程 的相关文章

  • Tinker接入小白教程

    在这里先给大家拜个晚年 xff0c 虽然说新已经过了 本文是今天第一篇文章 xff0c 已经有好长时间没总结了 xff0c 算了给2017开个好头吧 之前一直搞不懂什么是热修复 xff1f 其实热修复就是在应用不用重新安装的情况下更新应用
  • 扫盲Android Studio 仓库jCenter并发布自己的开源库

    AS从哪里获取到开源库 首先我们在使用第三方开源库时 xff0c 直接在项目的 gradle 文件中添加这样一行代码 xff1a compile 39 com jakewharton butterknife 7 0 1 39 添加完之后 x
  • Mac安装android studio后卡在building gradle project info的解决方法

    1 找到 gradle目录 xff0c 一般在 User lt 用户名 gt 下 macOS Sierra 10 12 3可以直接快捷键 shift 43 command 43 显示隐藏的文件即可看到 gradle文件夹 2 进入 grad
  • 动态规划

    动态规划是20世纪50年代由Richard Bellman发明的 不像贪婪算法 xff0c 回溯算法等 xff0c 单从名字上根本理解不了这是什么鬼 Bellman自己也说了 xff0c 这个名字完全是为了申请经费搞出来的 xff08 囧
  • 使用ItemTouchHelper拖拽时两个item跟着动解决方法

    使用ItemTouchHelper时 xff0c 当RecyclerView的item数只有三个时 xff0c 拖动第二个item并拖出边界时 xff0c 第三个item就会往右边动 xff08 按照正常逻辑 xff0c 第三个item是不
  • 仿微信朋友圈发表图片拖拽和删除功能

    小窥朋友圈实现原理 我们使用Android Device Monitor来分析朋友圈发布图片的界面实现原理 如果需要分析其他应用的界面实现也是采用这种方法哦 打开Android Device Monitor xff0c 选择DDMS xff
  • mac ssh记住密码

    以下方法只针对已生成ssh密码的情况 1 cd ssh 2 cp id rsa pub authorized keys 3 有无默认端口号 xff1a xff08 1 xff09 默认端口号为22 xff1a ssh copy id i s
  • idea启动项目启动一半总是卡住不动原因以及解决办法?

    idea 有时出现项目启动运行一半就卡住 xff0c 也不报错 xff0c 你是不是很纳闷 xff1f 其实可能是 你的 断点打的多或者打到方法名上了 解决办法 xff1a 1 找到下图圈出来的按钮 xff0c 这是查看当前项目所有断点的地
  • springsecurity设置用户登录状态过期,让其重新登录

    手动程序让session过期 xff0c 使用户重新登录 判断是否过期 Object expireDate 61 redisTemplate opsForValue get username 43 34 expireDate 34 if e
  • vue如何避免变量赋值后双向绑定

    如 xff1a this list 61 this list2 结果在list改变后 list2也改变 xff0c 这不是我们想要的效果 第一种 xff1a 利用 JSON parse 和 JSON stringify this list
  • 快速部署PaddleHub使用PaddleOCR

    创建虚拟环境 xff1a conda create name hubocr python 61 3 7 安装paddlepaddle pip install paddlepaddle 61 61 2 0 0rc i https mirror
  • 整蛊:聊天中,连续发送消息的vbs脚本

    如何实现连续发送消息呢 xff1f 准备工作 xff1a 只要我们将下面这段代码复制放在记事本里 xff0c 然后保存退出将记事本文件后缀名改为 vbs就可以了 On Error Resume Next Dim wsh s xTimes t
  • 如何处理从application.properties配置文件获取的汉字乱码问题

    平时从配置文件各种读取配置参数都正常 xff0c 但是有时候放了个中文就乱码 xff0c 你肯定试过网上好多方法 xff0c 都没解决 xff0c 那么来看下面 xff0c 恭喜你终于找这里了 这里 xff0c 我们以springboot框
  • mybatis使用相关问题汇总——持续更新中

    1 疑问 xff1a 怎样让表字段和实体类里的驼峰命名字段对应尼 xff1f 解决方案 xff1a 以下配置可让表字段和实体类的字段相对应 1 此方法只针对 39 user name 39 变 userName 这种驼峰有效 xff0c 但
  • 五大常用算法总结

    引言 据说有人归纳了计算机的五大常用算法 xff0c 它们是贪婪算法 xff0c 动态规划算法 xff0c 分治算法 xff0c 回溯算法以及分支限界算法 虽然不知道为何要将这五个算法归为最常用的算法 xff0c 但是毫无疑问 xff0c

随机推荐

  • android 下载应用 通知栏显示进度 下完之后点击安装 (很实用)

    先看效果图 xff1a 这是本人的习惯 xff0c 先上图显示效果 xff0c 看是否是想要的 xff0c 再看代码 有图有真相 代码 xff1a Main package com gem hsx appupdate import andr
  • 轻松解决vscode官网下载慢问题

    下载vscode安装包时 xff0c 都习惯去官网下载 xff0c 但是会如下图第一次下载那样缓慢 xff0c 对着下载处右击 xff0c 复制出下载链接 xff0c 把下载链接中code visualstudio com换成vscode
  • redis获取缓存对象bean时报:SerializationException: Could not read JSON: Could not resolve type

    一 在单个应用内进行 存 取 工作中的问题场景 xff1a 将一个实体类对象set存入 redis中 xff0c 用的时候去get时 xff0c 报错提示 xff1a SerializationException Could not rea
  • window 2012 R2 忘记密码处理方案

    方案一 xff1a 你是否开启了内置管理员 xff0c 或是还建立了其他的管理员账户 如果有的话 xff0c 请先以其他管理员账户登入电脑 xff0c 在本地计算机和组中 xff0c 更改你的账户密码 方案二 xff1a 如果没有的话 xf
  • 达梦数据库不同模式导入时系统提示字符集异常的解决办法

    近期参加了达梦DCA的培训 xff0c 练习的时候遇到一个问题 xff1a 同一模式导出导入正常 xff0c 但是在将DMTEST模式导出的dmp文件导入DMTEST02时 xff0c 遇到了如下报错 xff1a 提示本地编码 PG UTF
  • gradle 插件与gradle版本对应关系

    https developer android google cn studio releases gradle plugin html updating gradle 插件版本所需的Gradle版本1 0 0 1 1 3 2 2 1 2
  • 程序员的硬件设备

    程序员的硬件设备 程序员的工作台 很多人从网上 或者公司里 xff0c 看到程序员开发的工作台是这样的 其实这是个误区 xff0c 不同的人习惯不一样 xff0c 对于程序员来说 xff0c 一台性能好点的电脑就做够了 市场上有很多驻场外包
  • scp 本地复制文件到服务器

    1 本地复制文件到服务器 scp Users guolm Desktop ROOT war root 64 192 168 1 228 opt tomcat webapps 2 服务器到本地文件 scp root 64 192 168 1
  • Wireshark 认识捕获的分析数据包(及各个分层协议的介绍)

    综述 xff1a 认识Wireshark捕获数据包 当我们对Wireshark主窗口各部分作用了解了 xff0c 学会捕获数据了 xff0c 接下来就该去认识这些捕获的数据包了 Wireshark将从网络中捕获到的二进制数据按照不同的协议包
  • 禁用virtualbox自带的dhcp服务

    在你安装虚拟机的系统上面 xff0c 打开cmd xff1a cd D cd D softInstall VMvirtualbox6 D softInstall VMvirtualbox6 gt VBoxManage list dhcpse
  • MATLAB并行计算

    先上图 xff0c 图中求500次随机矩阵的特征值 xff0c 串行14 85s xff0c 并行3 63s 串行计算 tic S1 61 1 for i 61 1 500 S1 61 S1 43 max eig rand i end di
  • libsvm参数说明

    因为要用svm做regression xff0c 所以看了一些关于libsvm xff0c 总结以备用 libsvm在训练model的时候 xff0c 有如下参数要设置 xff0c 当然有默认的参数 xff0c 但是在具体应用方面效果会大大
  • Windows C# RabbitMQ 安装--配置--信息收发

    前言 近期要实现一个图片异步上传的需求 xff0c 需要用到RabbitMQ xff0c 辅助客户端完成对高并发请求的处理 一 安装Erlang 由于RabbitMQ服务器是用Erlang语言编写 xff0c 所以我们需要先安装Erlang
  • .MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1

    MalformedJsonException Use JsonReader setLenient true to accept malformed JSON at line 1 column 1 path 像这种低级错误 xff0c 我今天
  • 离线升级curl采坑

    先在线yum打包 1 安装repo rpm Uvh http www city fan org ftp contrib yum repo rhel6 x86 64 city fan org release 2 1 rhel6 noarch
  • uos桌面系统获取串口日志

    文章目录 一 准备工作1 问题机器2 收集日志机器 二 串口线连接三 收集日志机器上查看串口信息四 问题机器上设置gurb五 cutecom调试串口六 使用minicom工具收集串口信息 一 准备工作 1 问题机器 span class t
  • Ubuntu18.04.3安装GTX1650显卡驱动 安装CUDA 安装CUDNN

    0 前期准备 禁用BIOS的secure boot xff0c 即disable它 xff0c 如果不关闭 xff0c 使用第三方源安装显卡驱动会安装后不能使用 1 禁用nouveau 1 创建文件 xff0c 如果没有下载vim编辑器 x
  • mybatis中resultMap使用之返回分组数据

    1 resultMap 1 1 引言 resultMap是mybatis最重要的强大元素 通过描述数据的关系结构 xff0c 将结果集进行映射到java类或java bean中 xff0c 达到结果集复杂处理的目的 本文解决的主要问题的分组
  • 项目中使用JPush推送,遇到的问题

    JPush初始化错误 Android版本是4 0以上的 xff0c JPush包是1 60的 报错 xff1a 02 24 18 46 54 306 E AndroidRuntime 22522 FATAL EXCEPTION Thread
  • HIDL最全编译流程

    想了解HIDL介绍的可以参考 HIDL概述 xff0c 本篇文章主要介绍HIDL的详细编译流程及简单的客户端应用 xff08 C 43 43 跟Android客户端的应用 xff09 一 准备工作 整一套源码 xff0c Android O