Android R(11)跨进程调用自定义HIDL服务接口(八)

本文介绍如何使用C++实现HIDL服务的客户端,包括Android.bp配置、客户端代码编写及调试方法。通过具体示例展示了如何调用HIDL提供的接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  幸苦添加的HIDL service是为了服务各个client请求的。在实际场景中,HIDL service一般对应某个硬件模块,其中的接口则对应硬件所具备的功能。各个client则是对该模块有具体需求的。例如 HIDL-Light中则会提供控制具体led的接口,那么client则可以通过HIDL-Light所提供的接口来控制led,来实现各种联动功能。

1.Android.bp 说明

  HIDL的服务是支持cpp/ndk/java方式调用的,这里选用cpp的方式进行调用。那么编译的模块则是cc_binary,大致内容如下

cc_binary {
    name: "customHardwareClient1",
    vendor: true,
    relative_install_path: "hw",
    shared_libs: [
        ...
        "flagstaff.hardware.custom_hardware@1.0",
    ],
}

  从上面的Android.bp可得,测试模块为customHardwareClient1,位于/vendor/bin/hw路径。因为其需要调用custom_hardware接口的服务,则添加相应的动态库(flagstaff.hardware.custom_hardware@1.0),该动态库中涵盖了binder rpc的实现,以及ICustomHardware,.ha接口所转化出来的cpp头文件和代理类相关的接口实现。

2.customHardwareClient1实现

using flagstaff::hardware::custom_hardware::V1_0::ICustomHardware;
int main(int /* argc */, char** /* argv */) {

	android::sp<ICustomHardware> instance = ICustomHardware::getService();
	android::sp<ICustomHardware> custom = ICustomHardware::getService("custom");
	::android::hardware::Return<bool> ret = instance->enableHardware(true);
	if(!ret.isOk()){
		LOG(ERROR)<<"default Rmote call in failed.";
		return -1;
	}

	ret = custom->enableHardware(false);
	if(!ret.isOk()){
		LOG(ERROR)<<"custom Rmote call in failed.";
		return -1;
	}
	return 0;
}

  每一个HIDL接口被解析的时候都会被自动加上接口getService的,client则可以通过该接口来获取远程HIDL service对应的句柄。例如此处则是分别获取了远端HIDL service的default/custom实例。又因为在Android中的CPP对象都继承自RefBase,所以使用指针进行管理也比较方便。
  可以看到每次调用完远程接口后,首先调用isOK进行判断本次RPC是否正常,不想如此麻烦也可以使用接口 withDefault来替代,例如

bool ret = instance->enableHardware(true).withDefault(false)

3.编译

  编译完成后位于的路径如下

flagstaff@flagstaff-pc:~/aosp_r.lns/out/target/product/generic_x86_64$ ls vendor/bin/hw/customHardwareClient1
vendor/bin/hw/customHardwareClient1

4.运行

generic_x86_64:/ # logcat -s customHardwareClient1 flagstaff.hardware.custom_hardware&
[1] 1917
01-22 20:29:58.666   274   274 I flagstaff.hardware.custom_hardware: The instance of CustomHardware is registered to hwmanager in success.
generic_x86_64:/ # /vendor/bin/hw/customHardwareClient1
01-22 20:34:20.666   274   294 E flagstaff.hardware.custom_hardware: [service]default[data]1
01-22 20:34:20.666  1919  1919 E customHardwareClient1: default ret is false.
01-22 20:34:20.666   274   294 E flagstaff.hardware.custom_hardware: [service]default[data]0
01-22 20:34:20.667  1919  1919 E customHardwareClient1: custom ret is false.

  上面的LOG_TAG,customHardwareClient1\flagstaff.hardware.custom_hardware分别对应customHardwareClient1(pid:1919) 及CustomHardware service(pid:274)。

generic_x86_64:/ # ps -ef -p 274
UID             PID   PPID C STIME TTY          TIME CMD
system          274      1 0 29:57 ?        00:00:00 flagstaff.hardware.custom_hardware@1.0-service

  从log看default及custom实例的远程调用也是正常的,一次开一次关也已经反馈到了service了。
  另外如果有问题,欢迎留言或者email(836190520@qq.com)我,技术升级在于交流~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值