之前的文章已经分析了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. Scala——的并行集合

    当出现Kafka单个分区数据量很大,但每个分区的数据量很平均的情况时,我们往往采用下面两种方案增加并行度: l  增加Kafka分区数量 l  对拉取过来的数据执行repartition 但是针对这种 ...

  2. DVWA渗透笔记

    Command Injection Low <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $target = $_REQUEST[ ...

  3. Scanner的小细节

    Scanner对象是用来接收键盘输入的数据的,可以接收字符串,数字,浮点数,大数等多种数据. Scanner scanner = new Scanner(System.in); System.out. ...

  4. 绝地求生模拟登陆!高难度JS解密教程,Python高级爬虫开发,

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...

  5. 【JAVA】并发-基础IO

    一.java.io包支持.java的IO流有输入.输出两种,每种输入.输出流又可分为字节流.字符流两大类,字节流以字节为单位处理IO操作,字符流以字符为单位处理IO操作 JDK 1.4以后有java. ...

  6. .NET Core3.1总体预览和第一个Core程序的创建

    小伙伴们大家好!欢迎阅读本贴,这里是常哥说编程的专栏,.NetCore已经出来一段时间了,很多小伙伴可能也开始了学习,但是.NetCore毕竟在学习上和我们常用的.NET Framework还是有很大 ...

  7. [php] phpStudy+XDebug配置

    一.配置前说明: 1.phpStudy集成了XDebug扩展,所以不用单独下载XDebug. 2.打开XDebug扩展:其它选项菜单 > PHP扩展 > Xdebug 二.配置步骤: ph ...

  8. [Yii2] 快速套模板,加载JS,CSS(HTML标签<base>)

    刚开始学,弄了好久,不知道怎么加载JS.CSS,以及怎么不加载YII2自带的模板!其实真的好简单! 补: 其实是我垃圾,YII2默认访问路径是WEB,所以把style文件放到web下就能加载! 首先把 ...

  9. 异常处理方式一(try-catch-finally)

    package com.yhqtv.demo01Exception; /* * 一.异常的处理,抓抛模型 * * 过程一:“抛”:程序在正常 执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异 ...

  10. swoole学习--登录模块

    使用swoole+thinkphp6.0+redis 结合开发的登录模块,做完之后有几点感悟: 1.不要相信任务数据,包括请求的外部接口,特别是超时者部分,尽可能的交给task完成. 2.原来可以在入 ...