之前的文章已经分析了HIDL服务的注册和调用,这篇文章来总结下一个HIDL的服务如何编写。

缩写HAL文件

首先要确认放置文件夹和接口的包名,因为这跟后面使用脚本生成一部分代码有关,一般默认的放在hardware/interfaces目录下,我们写一个简单的IDemo.hal (hardware/interface/demo/1.0/IDemo.hal)

package android.hardware.demo@1.0;

interface IDemo {
init(int32_t level) generates (int32_t initRet); getProperty(string key) generates (int32_t getResult, string value);
};

生成接口的执行代码

使用如下命令生成执行文件:

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

这个命令会在hardware/interfaces/demo/1.0/default 下生成Demo.cpp 和 Demo.h两个文件,上面那个接口文件里,getProperty里有两个返回值,一般函数都只有一个返回值,那这个两个返回值是回事呢?那我们看看生成的执行代码是怎么样的?

#include "Demo.h"

namespace android {
namespace hardware {
namespace demo {
namespace V1_0 {
namespace implementation { Return<int32_t> Demo::init(int32_t level) {
//这种返回一个参数就按普通函数的做法,返回值就OK
return int32_t{};
} Return<void> Demo::getProperty(const hidl_string& key, getProperty_cb _hidl_cb ) {
//这里将两个返回值封装到一个回调函数里,然后传给调用者,使用如下
int result = ;
//使用map 里值来返回
  std::Map<hidl_string, hidl_string> demoMap = {
    {"one", "first"},
    {"two", "second"},
    {"three", "third"}
  };   int result = -1;
  hidl_string value = "";
  auto findRet = demoMap.find(key);
  if(findRet != demoMap.end()){
    result = 0;
    value = findRet->second;
  }
  //这里就将result 和 value 作为参数直接回调给调用者
  _hidl_cb(result, value);
return Void();
} }
}
}
}

生成Android.bp

方法实现完了之后,就需要用命令再生成一个Android.bp

hidl-gen -o hardware/interfaces/demo/1.0/default -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.demo@1.0

执行命令之后,就会在hardeare/interfaces/demo/1.0/default/Android.bp

进入hardware/interface目录下,执行./update-makefiles.sh之后,会生成demo/1.0/Android.bp 文件

现在有了两个Android.bp之后,需要采用绑定模式来创建一个Demo服务,在demo/1.0/default下创建一个service.cpp

添加绑定模式的服务代码

#include <android-base/logging.h>
#include <hidl/HidlTransportSupport.h>
#include <android/hardware/demo/1.0/IDemo.h> #undef LOG_TAG
#define LOG_TAG "android.hardware.demo@1.0-service" #include <hidl/LegacySupport.h>
#include "Demo.h"
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::hardware::demo::V1.::implementation::Demo; int main(){
configureRpcThreadpool(, true);
Demo demo = new Demo();
auto status = demo.registerAsService();
if(status != android::OK){
ALOGE("register demo As Service failed");
return -;
}
joinRpcThreadpool();
}

然后再在demo/1.0/default下创建android.hardware.demo@1.0-service.rc

service demo_hal_service /vendor/bin/hw/android.hardware.demo@1.0-service
class hal
user system
group system

在demo/1.0/default/Android.bp中增加 init_rc和 service.cpp的编译项,并将cc_library_shared 改为 cc_binary ,具体如下:

cc_binary {
name: "android.hardware.demo@1.0-service",
relative_install_path: "hw",
proprietary: true,
init_rc: ["android.hardware.demo@1.0-service.rc"],
srcs: [
"Demo.cpp",
"service.cpp"
],
shared_libs: [
"libhidlbase",
"libhidltransport",
"libutils",
     "liblog",
"android.hardware.demo@1.0",
],
}

然后通过mmm 或 mm 的方式 就可以编译出android.hardware.demo@1.0-service 和 android.hardware.demo@1.0-service.rc的服务了。

如果要自运行,添加上Selinux 的相关权限,可以参考其它HIDL 服务的selinux。

关于调用HIDL的接口,之前文章分析过,下面我们写核心的几句代码:

#include <android/hardware/demo/1.0/IDemo.h>
sp<IDemo> mDemo = IDemo::getService();
mDemo->init();
string mValue;
mDemo->getProperty("two", [&](int result, string value) {
if(result == )
mVaule = value;
});

到这里,HIDL的Demo服务代码可以结束了,后面可以增加复杂的Icallback HIDL接口相关的代码。

Android P HIDL demo代码编写 (原创)的更多相关文章

  1. Android 后台发送邮件 (收集应用异常信息+Demo代码)

    上一次说了如何收集我们已经发布的应用程序的错误信息,方便我们调试完善程序.上次说的收集方法主要是把收集的信息通过Http的post请求把相关的异常信息变成请求参数发送到服务器.这个对做过web开发的人 ...

  2. 远程调用历史及代码编写demo

    历史介绍部分: 远程调用大致经过了corba.webservice.二进制跟restful四个阶段 corba时代,corba(Common Object Request Broker Archite ...

  3. android JNI 简单demo(2)它JNI demo 写

    android JNI 简单demo(2)它JNI demo 写 一.搭建Cygwin 环境:http://blog.csdn.net/androidolblog/article/details/25 ...

  4. RAD Studio 10 自带Demo代码汇总说明

    大家好,好多朋友来信咨询Delphi和C++Builder的移动开发.DataSnap架构等问题,希望能有Demo代码学习.其实Delphi和C++Builder本身自带有很多示例代码,已经覆盖了大部 ...

  5. Android O HIDL的实现对接【转】

    本文转载自:https://blog.csdn.net/gh201030460222/article/details/80551897 Android O HIDL的实现对接1. HIDL的定义1.1 ...

  6. Web程序员开发App系列 - 调试Android和IOS手机代码(补图)

    Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...

  7. 谷歌开源项目Google Preview Image Extractor(PIEX) (附上完整demo代码)

    前天偶然看到谷歌开源项目中有一个近乎无人问津的项目Google Preview Image Extractor(PIEX) . 项目地址: https://github.com/google/piex ...

  8. Android ListFragment实例Demo(自己定义适配器)

    上一篇文章介绍了ListFragment,当中的ListView并没有自己定义适配器,实际上在实际开发中常会用到自己定义适配器,是实现更复杂的列表数据展示. 所以这篇文章添加了自己定义适配器.来进行L ...

  9. Android利用setLayoutParams在代码中调整布局(Margin和居中)

    我们平常可以直接在xml里设置margin,如: <ImageView android:layout_margin="5dip" android:src="@dra ...

随机推荐

  1. docker深入学习

    docker深入学习 一.容器的介绍和容器的发展史 为什么要学习容器? 在openstack之后,目前互联网最火热的技术莫过于docker容器了,早在2015年,京东技术备战双11就是使用了10万+D ...

  2. [算法]Miller-Robbin素数判定

    目录 一.实现原理 二.应用 判断一个正整数是否为素数 三.小结 一.实现原理 我们以前都是怎么判断素数的呢: 试除法: 若一个正整数N为合数,则存在一个能整除N的数k,其中\(2\leqslant ...

  3. Python-气象-大气科学-可视化绘图系列(三)—— 地图上自动标注省会名称(demo调整中)(代码+示例)

    本文为原创文章 本文链接:https://www.cnblogs.com/zhanling/p/12606990.html # -*- coding: utf-8 -*- ''' Author: He ...

  4. stand up meeting 11/16/2015

    第一周,熟悉任务中~ 大致写下一天的工作: 冯晓云:熟悉bing接口,本意是调在线的必应词典API,参阅了大量C#调用API开发.net的工作,[约莫是因为有个窗口互动性更强,所以这样的工作更有趣,也 ...

  5. 今天探究的CSS属性是box-sizing;

    首先BOX-SIZING属性是CSS3的属性: 语法: box-sizing : content-box || border-box || inherit 取值说明 1.content-box:此值为 ...

  6. 多窗体及窗体之间传值 以及listview的使用

    三中打开窗口窗体状态: 1   messagebox.show 类型  特点: 从窗口form 1里打开另一个窗体form2,form2不关闭的情况下form1 不能操作:代码如下: private ...

  7. mongo基础

    以下如有任何问题,直接到官方操作文档左上角搜索框搜索 安装 On Windows, this path is on the drive from which you start MongoDB. Fo ...

  8. 常见分布式全局唯一ID生成策略

    全局唯一的 ID 几乎是所有系统都会遇到的刚需.这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义.工业上有多种策略来获取这个全局唯一的id,针对常见的几种场景,我在这里进行 ...

  9. 博云DevOps 3.0重大升级 | 可用性大幅提升、自研需求管理&自定义工作流上线,满足客户多样化需求

    DevOps能够为企业带来更高的部署频率.更短的交付周期与更快的客户响应速度.标准化.规范化的管理流程,可视化和数字化的研发进度管理和可追溯的版本也为企业带来的了更多的价值.引入DevOps成为企业实 ...

  10. ES6中对数值的扩展

    上一节和大家学习了字符串的扩展,这一节轮到了数值,我们一起来学习数值的扩展. 剧透一下,这一节并不会很烧脑,都是介绍类的知识讲解,理解性的东西不多,初学者们也可以愉快地看完. 传统的写法 在介绍数值的 ...