当学习到一定程度的时候,发现helloworld 也越来越复杂了。

今天就来讲讲 HIDL 的一些内容吧

直接上

首先,这个是HIDL话说是在 Android 8 才开始引用进来的。而具体啥是HIDL,这个去搜搜吧。不在这里展开了。

首先Android 源码一套,是整编译完毕的,无误的之后的。

然后你得有块板子,将编译后的文件烧录到板子上能正常跑的。我的板子系统是64位的

代码路径主要是在

下面就开始真正的HIDL编辑过程了。

确保是已经执行了以下命令了

source build/envsetup.sh
lunch xxxx-userdebug

第一步:创建文件夹

mkdir -p hardware/interfaces/ddemo/1.0/default

第二步:创建 IDdemo.hal 文件

在 hardware/interfaces/ddemo/1.0/ 该路径下,创建一个 IDdemo.hal 文件

package android.hardware.ddemo@1.0;interface IDdemo {helloWorld(string name) generates (string result);getAge(string name) generates (string result);
};

第三步:使用 hidl-gen工具 生成文件

如果没有该工具,应该先生成

make hidl-gen -j24

如果有,那就直接敲以下命令

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

如果执行以上命令没有报错,那就是没问题,然后执行以下指令

执行      ./hardware/interfaces/update-makefiles.sh
如果不报错
那么执行   tree hardware/interfaces/ddemo/
可以看到该树hardware/interfaces/ddemo/
├── 1.0
│   ├── Android.bp
│   ├── Android.mk
│   ├── default
│   │   ├── Android.bp
│   │   ├── Ddemo.cpp
│   │   └── Ddemo.h
│   └── IDdemo.hal
└── Android.bp

此时查看一下 defalult 目录下的 Android.bp 里面到底是个啥

cc_library_shared {name: "android.hardware.ddemo@1.0-impl",relative_install_path: "hw",proprietary: true,srcs: ["Ddemo.cpp",],shared_libs: ["libhidlbase","libhidltransport","libutils","android.hardware.ddemo@1.0",],
}

此时执行以下命令,可以看到变异成功。这说明创建该接口没什么问题了

mmm hardware/interfaces/ddemo/1.0/default/

不要着急,继续一步一步来

第四步:修改生成的文件

Ddemo.h 将  extern   那行的注释打开

/*file name:  Ddemo.h*/#ifndef ANDROID_HARDWARE_DDEMO_V1_0_DDEMO_H
#define ANDROID_HARDWARE_DDEMO_V1_0_DDEMO_H#include <android/hardware/ddemo/1.0/IDdemo.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>namespace android {
namespace hardware {
namespace ddemo {
namespace V1_0 {
namespace implementation {using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::sp;struct Ddemo : public IDdemo {// Methods from IDdemo follow.Return<void> helloWorld(const hidl_string& name, helloWorld_cb _hidl_cb) override;Return<void> getAge(const hidl_string& name, getAge_cb _hidl_cb) override;// Methods from ::android::hidl::base::V1_0::IBase follow.};// FIXME: most likely delete, this is only for passthrough implementations
extern "C" IDdemo* HIDL_FETCH_IDdemo(const char* name);}  // namespace implementation
}  // namespace V1_0
}  // namespace ddemo
}  // namespace hardware
}  // namespace android#endif  // ANDROID_HARDWARE_DDEMO_V1_0_DDEMO_H

Ddemo.cpp 将  HIDL_FETCH_IDdemo 那行的注释打开

#include <iostream>
#include "Ddemo.h"namespace android {
namespace hardware {
namespace ddemo {
namespace V1_0 {
namespace implementation {// Methods from IDdemo follow.
Return<void> Ddemo::helloWorld(const hidl_string& name, helloWorld_cb _hidl_cb) {// TODO implementchar buf[128];::memset(buf,0,sizeof(buf));::snprintf(buf,100,"Ddemo hello world ,%s",name.c_str());hidl_string result(buf);_hidl_cb(result);return Void();
}Return<void> Ddemo::getAge(const hidl_string& name, getAge_cb _hidl_cb) {// TODO implementchar buf[128];::memset(buf,0,sizeof(buf));if(name == "zhangsan"){std::string age("24");::snprintf(buf,100,"Ddemo hello world  getAge:%s->%s",name.c_str(),age.c_str());}else{std::string age("15");::snprintf(buf,100,"Ddemo hello world getAge:%s->%s",name.c_str(),age.c_str());}hidl_string result(buf);_hidl_cb(result);return Void();
}// Methods from ::android::hidl::base::V1_0::IBase follow.IDdemo* HIDL_FETCH_IDdemo(const char* /* name */) {return new Ddemo();
}}  // namespace implementation
}  // namespace V1_0
}  // namespace ddemo
}  // namespace hardware
}  // namespace android

第五步:执行编译

mmm hardware/interfaces/ddemo/1.0/default/

成功编译之后可以看到生成

out/target/product/xxx/vendor/lib64/hw  目录下

android.hardware.ddemo@1.0-impl.so

以及

out/target/product/xxx/system/lib64 目录下的

android.hardware.ddemo@1.0.so

(可能不同的工程、平台会有所不同,看编译打印的log 找吧)

第六步:建立两个空文件并写入内容

touch hardware/interfaces/ddemo/1.0/default/android.hardware.ddemo@1.0-service.rc
touch hardware/interfaces/ddemo/1.0/default/service.cpp

写入内容:android.hardware.ddemo@1.0-service.rc

service ddemo_hal_service /vendor/bin/hw/android.hardware.ddemo@1.0-serviceclass haluser systemgroup system

编写 service.cpp

#define LOG_TAG "android.hardware.ddemo@1.0-service"#include <android/hardware/ddemo/1.0/IDdemo.h>
# include <hidl/LegacySupport.h>using android::hardware::ddemo::V1_0::IDdemo;
using android::hardware::defaultPassthroughServiceImplementation;int main(){printf("ddemo start...\n");return  defaultPassthroughServiceImplementation<IDdemo>();
}

在  hardware/interfaces/ddemo/1.0/default  目录下的 Android.bp 文件加入以下【cc_binary 】内容。总文件也就是如下:

cc_library_shared {name: "android.hardware.ddemo@1.0-impl",relative_install_path: "hw",proprietary: true,srcs: ["Ddemo.cpp",],shared_libs: ["libhidlbase","libhidltransport","libutils","android.hardware.ddemo@1.0",],
}cc_binary {name: "android.hardware.ddemo@1.0-service",defaults: ["hidl_defaults"],proprietary: true,relative_install_path: "hw",srcs: ["service.cpp",],init_rc: ["android.hardware.ddemo@1.0-service.rc"],shared_libs: ["libhidlbase","libhidltransport","libutils","liblog","android.hardware.ddemo@1.0","android.hardware.ddemo@1.0-impl",],
}

此时再次编译,

mmm hardware/interfaces/ddemo/1.0/default/

如果没有报错的话(有报错看错在哪里再修改),那就可以在 out/target/product/xxx/vendor/bin/hw

看到该文件 android.hardware.ddemo@1.0-service

至此,编译工作就基本上完工了。

第七步: 将变异生成的文件  push  到 板子中

(如果遇到是Read-Only ,可以先adb root   , adb remount  再试试。如果是user版本,那可能adb也没用。所以一开始为啥说是要userdebug版本)

adb push  android.hardware.ddemo@1.0-service   /vendor/bin/hwadb push  android.hardware.ddemo@1.0-impl.so   /system/lib64/
adb push  android.hardware.ddemo@1.0-impl.so   /system/lib64/hw/adb push  android.hardware.ddemo@1.0.so       /system/lib64/
adb push  android.hardware.ddemo@1.0.so       /system/lib64/hw/

然后试试执行  是否报错 android.hardware.ddemo@1.0-service

adb shell/vendor/bin/hw/android.hardware.ddemo@1.0-service

没有报错,那就是OK,如果报

CANNOT LINK EXECUTABLE "./functions_test": library "android.hardware.ddemo@1.0.so" not found

那可能是push进去的路径不对。修改到其他路径试试看。

接口写好了。那要写个客户端来进行验证

在 tools目录下创建文件夹  ddemo

然后创建 Andorid.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE := ddemo_test
LOCAL_SRC_FILES := \client.cpp \LOCAL_SHARED_LIBRARIES := \liblog \libhidlbase \libutils \android.hardware.ddemo@1.0 \include $(BUILD_EXECUTABLE)

同目录创建 client.cpp 并写入

# include <android/hardware/ddemo/1.0/IDdemo.h># include <hidl/Status.h># include <hidl/LegacySupport.h># include <utils/misc.h># include <hidl/HidlSupport.h># include <stdio.h>
#include <cstdlib>using android::hardware::ddemo::V1_0::IDdemo;
using android::sp;
using android::hardware::hidl_string;int main()
{int ret;android::sp<IDdemo> service = IDdemo::getService();if(service == nullptr) {printf("Failed to get service\n");return -1;}service->helloWorld("Ddemo", [&](hidl_string result) {printf("%s\n", result.c_str());});service->getAge("zhangsan",[&](hidl_string age) {printf("age = %s \n",age.c_str());});service->getAge("lisi",[&](hidl_string age) {printf("age = %s \n",age.c_str());});return 0;
}

然后 在同一个的命令编译框内执行以下命令

mmm  tools/ddemo/

就可以看到

ddemo_test 该执行文件了

将该可执行文件push 到 /data/目录下

然后执行

adb shell
chmod  777 /data/ddemo_test
/data/ddemo_test

至此,验证OK

可能遇到的问题

CANNOT LINK EXECUTABLE "./functions_test": library "android.hardware.ddemo@1.0.so" not found

在 执行  android.hardware.functions@1.0-service 的时候遇到

那就将  Android.bp 中的 cc_binary  中的 srcs 修改成如下,也就是将接口增加过来。

srcs: ["service.cpp","Ddemo.cpp",],

如果是在执行 ddemo_test  的时候遇到该报错,那可能是编译  ddemo_test 的时候使用的窗口和 编译 android.hardware.functions@1.0.so 的窗口不一致。都用同一个窗口编译,再将该窗口编译的生成的 ddemo_test  推进板子再试试看。

参考链接:Android HIDL学习(2) ---- HelloWorld - 简书

Android hidl开发简单教程 - 灰信网(软件开发博客聚合)

Android 8 的HIDL 学习 之 Code demo相关推荐

  1. android treble项目HIDL学习总结

    文章目录 概念介绍 Treble项目---HIDL产生背景,独立升级framework需求 HIDL概念---HAL 接口定义语言,目标framework和HAL解耦 HIDL的两种模式---Pass ...

  2. Android HIDL学习 - HelloWord入门(整理1)

    Android HIDL学习(整理1) 概述 入手准备 实例应用 1.HIDL接口文件定义 2. 生成HAL相关文件 3. 实现HAL服务端的共享库 4. Hal server端启动注册程序 5.HI ...

  3. [Android]Android P(9) WIFI学习笔记 - HAL (1)

    目录 前文回顾 前言 入口 WifiNative 初始化 打开WIFI IWifiChip IWifiCond ISupplicant 前文回顾 WIFI学习笔记 - Framework (1) WI ...

  4. Android中的ShareSDK学习

    Android中的ShareSDK学习 一. 什么是ShareSDK ShareSDK是一种社会化分享组件,为iOS.Android.WP8 的APP提供社会化功能,集成了一些常用的类库和接口,缩短开 ...

  5. Android Qcom USB Driver学习(四)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) VID/PID识别USB设备 CDC-ACM驱动介绍   CDC-ACM(Communication De ...

  6. Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)

    Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...

  7. Android Qcom Audio架构学习

    总结: Android Audio不简单呀,一个人摸索入门不容易的,研究了一段时间,感觉还不是很懂,但以下的知识对入门还是有帮助的. Audio架构中的名词 FE(Front End) 提供pcm的设 ...

  8. Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植

    Android(4.2) Sensors 学习--G-sensor,Gyroscope驱动移植 目录(?)[-] Sensors 种类和功能 G-sensor驱动code G-sensor HAL 注 ...

  9. Android折叠屏开发学习(三)---使用MotionLayout实现折叠屏分屏效果

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为6259字,预计阅读11分钟 前言 今天是折叠屏开发的第三篇,前面已经介绍了铰链的角度监听和Jetpack Window实现监听 ...

最新文章

  1. 无法消除恐惧?Nature发现肠道菌与大脑间更多的神秘联系...
  2. Session分布式共享 = Session + Redis + Nginx
  3. mybatis配置时出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)...
  4. 数据结构与算法09 之图
  5. php定时发送生日模块消息_Swoft 2.0.5 更新,新增高效秒级定时任务、异常管理组件...
  6. HDU多校10 - 6886 Tic-Tac-Toe-Nim(尼姆博奕)
  7. 读取/书写Java的XML格式properties文件
  8. 6月份美国域名总量新增近5.4万个 环比减少51%
  9. git push命令_Git Push命令解释
  10. java实践项目_Java项目开发实践
  11. 【CSS】CSS 的优先级总结
  12. 拳王虚拟项目公社:怎么找低价电影票,低价电影票怎样赚钱,低价电影票实操赚钱方法?
  13. java方法重载两个数相加_java方法重载实验:判断键盘输入的两个数据的类型后进行比较...
  14. 0-9 倒计时 8x8 点阵 实现
  15. win7(SP1 64位)升级IE浏览器升级到IE11
  16. mysql 2037年,正确的方法来存储2037年之后的MySQL日期
  17. IRPT_TAS简介
  18. 无限循环小数四则运算_无限循环小数能做加减乘除四则运算吗?无限不循环小数能做吗??...
  19. 易福门电感式接近开关IGS200
  20. 大三期末网页设计作业 以旅游景点风景主题介绍网站设计与实现 (广东名胜古迹)

热门文章

  1. 为什么会感冒之中西医解释
  2. 复习总结:数据挖掘(挖掘)
  3. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II
  4. ubuntu18 遇到libc6 版本冲突问题
  5. 干货 | 答编辑/审稿人问之样本量大关
  6. Redis学习笔记( 入门篇)
  7. style.zIndex
  8. C语言二级公共基础知识选择题高频考点**粗略~粗略~粗略个人笔记**
  9. 救援(YZOJ-1073)
  10. linux数组shell操作,shell数组操作简明总结