hidl 原理分析_Android P HIDL demo代码编写 (原创)

本文详细介绍了如何编写Android P中的HIDL服务,包括HAL文件的创建、接口代码的生成、Android.bp配置、服务注册与实现,以及调用HIDL接口的核心代码示例。
摘要由CSDN通过智能技术生成

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

缩写HAL文件

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

package android.hardware.demo@1.0;interfaceIDemo {

init(int32_t level) generates (int32_t initRet);

getProperty(string key) generates (int32_t getResult, stringvalue);

};

生成接口的执行代码

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

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"

namespaceandroid {namespacehardware {namespacedemo {namespaceV1_0 {namespaceimplementation {

ReturnDemo::init(int32_t level) {

//这种返回一个参数就按普通函数的做法,返回值就OKreturnint32_t{};

}

Return Demo::getProperty(const hidl_string&key, getProperty_cb _hidl_cb ) {//这里将两个返回值封装到一个回调函数里,然后传给调用者,使用如下

int result = 0;//使用map 里值来返回

std::Map 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);

returnVoid();

}

}

}

}

}

生成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 #include#include

#undef LOG_TAG

#define LOG_TAG "android.hardware.demo@1.0-service"#include#include"Demo.h"

usingandroid::hardware::configureRpcThreadpool;usingandroid::hardware::joinRpcThreadpool;using android::hardware::demo::V1.0::implementation::Demo;intmain(){

configureRpcThreadpool(4, true);

Demo demo= newDemo();

auto status=demo.registerAsService();if(status !=android::OK){

ALOGE("register demo As Service failed");return -1;

}

joinRpcThreadpool();

}

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

service demo_hal_service /vendor/bin/hw/android.hardware.demo@1.0-serviceclasshal

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 sp mDemo =IDemo::getService();

mDemo->init(1);stringmValue;

mDemo->getProperty("two", [&](int result, string value) {if(result == 0)

mVaule=value;

});

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值