HIDL最全编译流程_如何编译hidl-程序员宅基地

技术标签: android  HIDL  

想了解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 [email protected]

参数说明:

  • -L 语言类型,包括c++, c++-headers, c++-sources, export-header, c++-impl, java, java-constants, vts, makefile, androidbp, androidbp-impl, hash等。hidl-gen可根据传入的语言类型产生不同的文件。
  • fqname 完全限定名称的输入文件。比如本例中[email protected],要求在源码目录下必须有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 [email protected];

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

 

 

 

 

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

  • [email protected]
  • 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$ [email protected]

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跟[email protected],其中[email protected]是程序的入口函数。新的目录结构如下:

.

├── 1.0

│   ├── Android.bp

│   ├── Android.mk

│   ├── default

│   │   ├── Android.bp

│   │   ├── [email protected]

│   │   ├── Gunder.cpp

│   │   ├── Gunder.h

│   │   └── service.cpp

│   └── IGunder.hal

└── Android.bp

[email protected]的实现如图:

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/[email protected]

out/target/product/mek_8q/vendor/lib64/hw/[email protected]

out/target/product/mek_8q/vendor/etc/init/[email protected]

        

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\[email protected]  /vendor/lib64/hw
  • adb push X:\IMX8_b0beta2\out\target\product\mek_8q\system\lib64\[email protected] /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\[email protected] /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++客户端调试:

先启动./[email protected]服务,然后启动gunder_client程序,执行结果如下:

 

Android客户端执行:

先启动./[email protected]服务,然后通过命令拉起MainActivity界面

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

 

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

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013357557/article/details/84561652

智能推荐

arm-linux-androideabi-readelf_mac arm-linux-androideabi-readelf-程序员宅基地

文章浏览阅读1.9k次。使用arm-linux-androideabi-readelf读取信息:arm-linux-androideabi-readelfUsage: readelf elf-file(s) Display information about the contents of ELF format files Options are: -a --all Equi_mac arm-linux-androideabi-readelf

使用模板方法 java实现二维码生成 并进行二维码白边的裁剪_裁剪二维码的白边-程序员宅基地

文章浏览阅读1.1k次。java 模板方法 实现二维码生成 并进行二维码白边自定义的裁剪:由于自己最近在学设计模式,就想着如何能运用到自己工作的项目中。找了半天,想起自己之前写的一段关于生成二维码图片的代码。后面由于同事的需求不同,他们在里面添加了一下其它逻辑的代码。现在感觉这段代码已经不太好被扩展维护了。于是就用选择了设计模式中的模板方法重新进行设计。package **;import java.awt.Re..._裁剪二维码的白边

IntelliJ IDEA创建maven web项目-程序员宅基地

文章浏览阅读608次。IntelliJ IDEA创建maven web项目不妨先了解下Maven 项目是什么什么是maven项目?简单来说,就是maven工具构建的项目就是maven项目。maven是一个跨平台的项目管理软件。为什么要用maven构建项目?当你的项目很大,当你需要模块化拆分,部署,当你的jar包乱的跟粥似的,开发人员使用jar冲突等等问题出现时……你用maven就是合适的,但前...

中文短文本分类实例十二-HAN(Hierarchical Attention Networks for Document Classification)_中文短文本模型-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏10次。一.概述HAN(Hierarchical Attention Networks for Document Classification),层次化注意力机制等,是Zichao Yang等2016年提出的一种新型文本分类模型。它主要使用词(字)语级别,和句子级别的注意力机制Attention,构建文本特征表示,层次化文本(即字、词、句子),十分符合人类直觉,也是近年来图像、NLP等..._中文短文本模型

SQL直接操作excel表(查询/导入/插入)-程序员宅基地

文章浏览阅读619次。--配置权限 exec sp_configure 'show advanced options',1reconfigureexec sp_configure 'Ad Hoc Distributed Queries',1reconfigureexec sp_configure 'xp_cmdshell',1reconfigurego

Airtest工具安装教程-自用_安装airtesttool-程序员宅基地

文章浏览阅读2.4k次。Airtest工具安装教程最近需要获取某些手机APP的输入下拉框词,所以需要控制手机,并获取信息。这里记录一下安装流程,以防以后忘记。步骤1. 安装JDK因为之前安装别的包(hanlp), 所以已经安装过JDK了。2. 安装SDK我下载http://tools.android-studio.org/index.php/sdk下载好了,到安装目录,运行SDK Manager.exe勾选 Android SDK Platform-tools,点右下角的install。注意需要翻墙。最后_安装airtesttool

随便推点

Java答题技巧(一)-程序员宅基地

文章浏览阅读128次。答题技巧第一章 Java编程基础1,方法是一种定义了某种具体抽象的运算。利用具有属性和行为的类,java实现了抽象。行为有抽象的操作来定义。2,对象是类的实例。对象根据实现抽象的类定义来创建。所以创建对象的那些抽象的具体实现。3,对象通常是通过new运算符创建的。引用变量的声明创建一个变量,而不管是否向该变量赋值。4,实例成员是一个字段或一个实...

在 Internet Explorer 5.5 中创建可编辑的 Web 页-程序员宅基地

文章浏览阅读78次。现在,您可以直接将 Microsoft(R) Internet Explorer 复杂的 HTML 编辑功能合并到 Web 页中!Microsoft 的 HTML 编辑器是对 Internet Explorer 中 HTML 分析和展现引擎的内置扩展。从 Internet Explorer 4.0 开始,MSHTML 编辑器已经为主机应用程序提供了开发基于 HTML 的文本编辑器和 Web 创作应..._internet explore能制作网页吗

Oracle 10g 11c 12c的自动统计任务问题_oracle 12c gather_stats_job-程序员宅基地

文章浏览阅读555次。先来看下oracle 10g中的自动统计任务的问题。从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO的统计信息。这个自动任务默认情况下在工作日晚上10:00-6:00和周末全天开启。调用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集统计信息。该过程首先检测统计信息缺失和陈旧的对象。然后确定优先级,再开始进行统计信息。可以通过以下查询这个JOB的运行情况:se._oracle 12c gather_stats_job

libsvm 多分类遇到的问题_weka libsvm分类器的c和g-程序员宅基地

文章浏览阅读2k次。现在已经完全正确的调用了libsvm,我所处理的问题是利用libsvm进行文本分类1 首先利用CHI进行特征提取2 利用TFIDF进行权重提取3 把文章组织成libsvm可以识别的格式4 利用上面的三个步骤,就可以把数据传入libsvm进行训练,但是训练之前,还要进行参数调优,得到最好的c和g5 参数调优的过程就是利用 python grid._weka libsvm分类器的c和g

JSON与cJSON_json 结束符-程序员宅基地

文章浏览阅读691次。该文主要记录是JSON的基本概念以及对应的cJSON API。一、什么是JSON ?详细的介绍见 https://www.json.org/ ,可以看到, JSON 可分为两类,一类是object ,一类是array。1.1 object引用官网的图,object 的定义为以'{'为起始符,'}'为结束符, 中间包含以','为间隔符的数个键-值对的集合,当然也可为空。1.2..._json 结束符

RS232/UART_rs232为啥是负逻辑-程序员宅基地

文章浏览阅读842次。了解UART1.serial communication  Serial communication is a communication method that uses one or two transmission lines to send and receive data, and that data is continuously sent and received one b..._rs232为啥是负逻辑