Android P HIDL demo代码编写 (原创)
之前的文章已经分析了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代码编写 (原创)的更多相关文章
- Android 后台发送邮件 (收集应用异常信息+Demo代码)
上一次说了如何收集我们已经发布的应用程序的错误信息,方便我们调试完善程序.上次说的收集方法主要是把收集的信息通过Http的post请求把相关的异常信息变成请求参数发送到服务器.这个对做过web开发的人 ...
- 远程调用历史及代码编写demo
历史介绍部分: 远程调用大致经过了corba.webservice.二进制跟restful四个阶段 corba时代,corba(Common Object Request Broker Archite ...
- android JNI 简单demo(2)它JNI demo 写
android JNI 简单demo(2)它JNI demo 写 一.搭建Cygwin 环境:http://blog.csdn.net/androidolblog/article/details/25 ...
- RAD Studio 10 自带Demo代码汇总说明
大家好,好多朋友来信咨询Delphi和C++Builder的移动开发.DataSnap架构等问题,希望能有Demo代码学习.其实Delphi和C++Builder本身自带有很多示例代码,已经覆盖了大部 ...
- Android O HIDL的实现对接【转】
本文转载自:https://blog.csdn.net/gh201030460222/article/details/80551897 Android O HIDL的实现对接1. HIDL的定义1.1 ...
- Web程序员开发App系列 - 调试Android和IOS手机代码(补图)
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- 谷歌开源项目Google Preview Image Extractor(PIEX) (附上完整demo代码)
前天偶然看到谷歌开源项目中有一个近乎无人问津的项目Google Preview Image Extractor(PIEX) . 项目地址: https://github.com/google/piex ...
- Android ListFragment实例Demo(自己定义适配器)
上一篇文章介绍了ListFragment,当中的ListView并没有自己定义适配器,实际上在实际开发中常会用到自己定义适配器,是实现更复杂的列表数据展示. 所以这篇文章添加了自己定义适配器.来进行L ...
- Android利用setLayoutParams在代码中调整布局(Margin和居中)
我们平常可以直接在xml里设置margin,如: <ImageView android:layout_margin="5dip" android:src="@dra ...
随机推荐
- Odoo 查看 模块app 对应的 源码 相关依赖模块信息
安装好app后再路径上 加上debug ,在查看 app 信息 如下 http://127.0.0.1:8069/web?debug#id=138&view_type=form&mod ...
- 微服务框架-Spring Cloud
Spring Cloud入门 微服务与微服务架构 微服务架构是一种新型的系统架构.其设计思路是,将单体架构系统拆分为多个可以相互调用.配合的独立运行的小程序.这每个小程序对整体系统所提供的功能就称为微 ...
- 在众多小说中,Python告诉你哪本小说好看
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 有趣的Python PS:如有需要Python学习资料的小伙伴可以 ...
- L12 Transformer
Transformer 在之前的章节中,我们已经介绍了主流的神经网络架构如卷积神经网络(CNNs)和循环神经网络(RNNs).让我们进行一些回顾: CNNs 易于并行化,却不适合捕捉变长序列内的依赖关 ...
- 百度api实现人脸对比
第一步(注册账号): 点这里注册百度云账号 如图: 创建应用得到 APP_ID API_KEY SECRET_KEY 第二步(代码): import requests import base64 ...
- Java 14 来势汹汹,这回让空指针无处遁形!!
上篇:Java 14 之模式匹配,非常赞的一个新特性! 相信在坐的每一位 Java 程序员都遇到过空指针异常: NullPointerException(NPE),不甚其烦. 栈长之前也分享几篇避免空 ...
- api_DZFPKJ & api_DZFPCX(get_AES_url代码优化)
通过AES加密网站的接口来传值,不需要手动加密字符串后复制过来传值. #coding:utf-8 import requests import re def get_aes_url(key, text ...
- PHP函数:debug_backtrace
debug_backtrace() - 产生一条 PHP 的回溯跟踪(backtrace). 说明: debug_backtrace ([ int $options = DEBUG_BACKTRAC ...
- vue2.x学习笔记(十五)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12609450.html. 组件的自定义事件 这里来学习一下组件中的自定义事件. 事件名 不同于组件名和prop,事 ...
- Flair:一款简单但技术先进的NLP库
过去的几年里,在NLP(自然语言处理)领域,我们已经见证了多项令人难以置信的突破,如ULMFiT.ELMo.Facebook的PyText以及谷歌的BERT等等. 这些技术大大推进了NLP的前沿性研究 ...