AIDL实践

先贴最后的文件目录:

aidl/android/hardware/demo/IFoo.aidl:

package android.hardware.demo;import android.hardware.demo.IFooCallback;@VintfStability
interface IFoo {void doFoo();int doFooWithParameter(int param);void registerCallback(IFooCallback callback);}

aidl/android/hardware/demo/IFooCallback.aidl:

package android.hardware.demo;@VintfStability
interface IFooCallback {int onTest(int param);
}

aidl/Android.bp:

aidl_interface {name: "android.hardware.demo",vendor_available: true,srcs: ["android/hardware/demo/*.aidl"],stability: "vintf",owner: "demo",imports: ["android.hardware.common-V2",],backend: {cpp: {enabled: false,},java: {enabled: false,sdk_version: "module_current",},},
}

以上三个文件写完以后就可以运行mm先处理aidl文件了。会提示你运行m android.hardware.demo-update-api来自动生成(更新)aidl/aidl_api文件夹。

aidl/default目录下的文件内容:

Foo.h:

#ifndef _FOO_H_
#define _FOO_H_#include <aidl/android/hardware/demo/BnFoo.h>namespace aidl {
namespace android {
namespace hardware {
namespace demo {
class Foo: public BnFoo {public:Foo(/* args */);~Foo();::ndk::ScopedAStatus doFoo();   ::ndk::ScopedAStatus doFooWithParameter(int32_t in_param, int32_t* _aidl_return);::ndk::ScopedAStatus registerCallback(const std::shared_ptr<::aidl::android::hardware::demo::IFooCallback>& in_callback);
};
}  // namespace demo
}  // namespace hardware
}  // namespace android
}  // namespace aidl#endif

Foo.cpp:


#include <iostream>
#include "Foo.h"namespace aidl {
namespace android {
namespace hardware {
namespace demo {Foo::Foo(/* args */) {std::cout << "Foo::Foo!" << std::endl;
}Foo::~Foo() {std::cout << "Foo::~Foo!" << std::endl;
}::ndk::ScopedAStatus Foo::doFoo()
{std::cout << "doFoo!" << std::endl;return ndk::ScopedAStatus::ok();
}::ndk::ScopedAStatus Foo::doFooWithParameter(int32_t in_param, int32_t* _aidl_return)
{std::cout << "doFooWithParameter!" << std::endl;*_aidl_return = in_param + 39;return ndk::ScopedAStatus::ok();    
}::ndk::ScopedAStatus Foo::registerCallback(const std::shared_ptr<::aidl::android::hardware::demo::IFooCallback>& in_callback){int i = 0;in_callback->onTest(39, &i);std::cout << "FooCallback::onTest called on Bp side, returns : " << i << std::endl;return ndk::ScopedAStatus::ok();
}}
}
}
}

service.cpp:


#include <android-base/logging.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <binder/ProcessState.h>#include "Foo.h"using aidl::android::hardware::demo::Foo;int main() {// Enable vndbinder to allow vendor-to-venfor binder callandroid::ProcessState::initWithDriver("/dev/vndbinder");auto binder = ::ndk::SharedRefBase::make<Foo>();const std::string name = std::string() + Foo::descriptor + "/default";CHECK_EQ(STATUS_OK, AServiceManager_addService(binder->asBinder().get(), name.c_str()))<< "Failed to register " << name;ABinderProcess_setThreadPoolMaxThreadCount(64);ABinderProcess_startThreadPool();ABinderProcess_joinThreadPool();return EXIT_FAILURE;  // should not reached
}

Android.bp:(里面可能很多库是不需要的)

cc_binary {name: "android.hardware.demo-service",vendor: true,relative_install_path: "hw",init_rc: ["android.hardware.demo-service.rc"],vintf_fragments: ["android.hardware.demo-service.xml"],srcs: ["Foo.cpp","service.cpp",],local_include_dirs: [],cflags: ["-Wall","-Werror",],cppflags: ["-std=c++17","-Wno-sign-compare","-fexceptions",],shared_libs: ["libbase","liblog","libhardware","libbinder_ndk","libbinder","libutils","libnativewindow","libui","libdrm","libdmabufheap","android.hardware.demo-V1-ndk_platform","libhidlbase","libutilscallstack","libcutils","libfmq",],static_libs: ["libaidlcommonsupport","libpolym",],
}

android.hardware.demo-service.xml:(最后要push到/vendor/etc/vintf/manifest目录下)


<manifest version="1.0" type="device"><hal format="aidl"><name>android.hardware.demo</name><version>1</version><fqname>IFoo/default</fqname></hal>
</manifest>

最后一个文件不是必须要加,也可以手动起service:

android.hardware.demo-service.rc:


service android.hardware.demo-service /vendor/bin/hw/android.hardware.demo-serviceinterface aidl android.hardware.demo.IFoo/defaultclass haluser systemgroup system

记得有一个自动生成的库要push进去:

 adb push .\r12\out\target\product\xxx\vendor\lib64\android.hardware.demo-V1-ndk_platform.so /vendor/lib64/

完毕。

push进去手动运行/vendor/bin/hw/android.hardware.demo-service,这个时候用service list命令可以看到自己service了。

使用的代码就比较简单:

aidl/client目录下:

main.cpp:

#include <iostream>
#include <android/binder_manager.h>
#include <aidl/android/hardware/demo/IFoo.h>
#include <aidl/android/hardware/demo/BnFooCallback.h>using ::aidl::android::hardware::demo::IFoo;
using ::aidl::android::hardware::demo::BnFooCallback;
using ::ndk::SpAIBinder;class FooCallback : public BnFooCallback {public:::ndk::ScopedAStatus onTest(int32_t in_param, int32_t* _aidl_return) override;
};::ndk::ScopedAStatus FooCallback::onTest(int32_t in_param, int32_t* _aidl_return) {int i = in_param*2;*_aidl_return = i;std::cout << "FooCallback::onTest called on Bn side, will return : " << i << std::endl;return ndk::ScopedAStatus::ok();
}int main()
{std::shared_ptr<IFoo> mFoo;mFoo = IFoo::fromBinder(SpAIBinder(AServiceManager_waitForService("android.hardware.demo.IFoo/default")));mFoo->doFoo();int i = 0;mFoo->doFooWithParameter(-1, &i);std::cout << "Foo::doFooWithParameter called, returns : " << i << std::endl;std::shared_ptr<FooCallback> mFooCallback;mFooCallback = ndk::SharedRefBase::make<FooCallback>();mFoo->registerCallback(mFooCallback);return 0;}

Android.bp:


cc_binary {name: "demotest",vendor: true,srcs: ["main.cpp",],shared_libs: ["libbase","libutils","libbinder_ndk","liblog","libnativewindow","android.hardware.demo-V1-ndk_platform","libutilscallstack","libcutils","libfmq",],static_libs: ["libarect","libaidlcommonsupport",],
}

可能有多余的库也拷进来的,可以自己试着删掉一些没关系的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247475.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例分析技巧-软件工程

一、考试情况 需求分析&#xff08;※※※※&#xff09;面向对象设计&#xff08;※※&#xff09; 二、结构化需求分析 数据流图 数据流图的平衡原则 数据流图的答题技巧 利用数据平衡原则&#xff0c;比如顶层图的输入输出应与0层图一致补充实体 人物角色&#xff1a;客户、…

力扣3. 无重复字符的最长子串(滑动窗口)

Problem: 3. 无重复字符的最长子串 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 由于题目要求求出字符串中最长的连续无重复字符的最长子串&#xff0c;所以利用这个特性我们可以比较容易的想到利用双指针中的滑动窗口技巧来解决&#xff0c;但在实际的求解中…

[机器学习]简单线性回归——梯度下降法

一.梯度下降法概念 2.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt# 1. 导入数据&#xff08;data.csv&#xff09; points np.genfromtxt(data.csv, delimiter,) points[0,0]# 提取points中的两列数据&#xff0c;分别作为x&#xff0c;y …

从CNN ,LSTM 到Transformer的综述

前情提要&#xff1a;文本大量参照了以下的博客&#xff0c;本文创作的初衷是为了分享博主自己的学习和理解。对于刚开始接触NLP的同学来说&#xff0c;可以结合唐宇迪老师的B站视频【【NLP精华版教程】强推&#xff01;不愧是的最完整的NLP教程和学习路线图从原理构成开始学&a…

TCP_拥塞控制

引言 24年春节马上就要到了&#xff0c;作为开车党&#xff0c;最大的期盼就是顺利回家过年不要堵车。梦想是美好的&#xff0c;但现实是骨感的&#xff0c;拥堵的道路让人苦不堪言。 在网络世界中&#xff0c;类似于堵车的问题也存在&#xff0c;而TCP&#xff08;Transmissi…

如何使用Everything随时随地远程访问本地电脑搜索文件

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…

数据结构排序算详解(动态图+代码描述)

目录 1、直接插入排序&#xff08;升序&#xff09; 2、希尔排序&#xff08;升序&#xff09; 3、选择排序&#xff08;升序&#xff09; 方式一&#xff08;一个指针&#xff09; 方式二&#xff08;两个指针&#xff09; 4、堆排序&#xff08;升序&#xff09; 5、冒…

go包与依赖管理

包&#xff08;package&#xff09; 包介绍 Go语言中支持模块化的开发理念&#xff0c;在Go语言中使用包&#xff08;package&#xff09;来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件&#xff08;.go结尾的文件&#xff09;组成&#xff0c;是一种高级的代码…

CSS之定位

定位在CSS当中是一个比较重要的点&#xff0c;接下来&#xff0c;让我为大家介绍一下定位吧&#xff01; 属性描述position-relative相对定位position-absolute绝对定位position-fixed固定定位position-sticky粘性定位position-static静态定位 一、相对定位 给元素设置 posi…

Vue-40、Vue中TodoList案例

1、MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" v-model"title" keyup.enter"add"></div> </template>&…

OpenHarmony—仅允许在表达式中使用typeof运算符

规则&#xff1a;arkts-no-type-query 级别&#xff1a;错误 ArkTS仅支持在表达式中使用typeof运算符&#xff0c;不允许使用typeof作为类型。 TypeScript let n1 42; let s1 foo; console.log(typeof n1); // number console.log(typeof s1); // string let n2: typeof …

什么是SQL,什么是MYSQL?MYSQL的架构以及SQL执行语句的过程是什么?有哪些数据库的类型?一篇文章带你弄懂!

文章目录 前言一、为什么需要数据库二、数据库的相关概念1.什么是结构化查询语言 (SQL)2.什么是数据库管理系统 (DBMS)3.什么是 MySQL 数据库 三、数据库分类1.关系型数据库&#xff08;SQL&#xff09;2.非关系型数据库&#xff08;NoSQL&#xff09; 四、MYSQL架构1.各组件功…

ES 分词器

概述 分词器的主要作用将用户输入的一段文本&#xff0c;按照一定逻辑&#xff0c;分析成多个词语的一种工具 什么是分词器 顾名思义&#xff0c;文本分析就是把全文本转换成一系列单词&#xff08;term/token&#xff09;的过程&#xff0c;也叫分词。在 ES 中&#xff0c;Ana…

河南冷链物流盛典 华鼎科技引领行业创新共筑冷链强省梦

近日&#xff0c;由河南省商务厅指导、河南省物流协会主办的在郑州举行&#xff0c;本次大会以“创新驱动未来”为主题,近300名冷链物流行业精英、专家学者等参加了本届盛典。 河南省委、省政府高度重视物流业发展&#xff0c;出台了《河南省“十四五”现代物流业发展规划》、…

go数据格式-JSON、XML、MSGPack

1. JSON json是完全独立于语言的文本格式&#xff0c;是k-v的形式 name:zs应用场景&#xff1a;前后端交互&#xff0c;系统间数据交互 json使用go语言内置的encoding/json 标准库编码json使用json.Marshal()函数可以对一组数据进行JSON格式的编码 func Marshal(v interface{}…

OkHttp完全解读

一&#xff0c;概述 OkHttp作为android非常流行的网络框架&#xff0c;笔者认为有必要剖析此框架实现原理&#xff0c;抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用&#xff0c;如桥接、缓存、连接复用等&#xff0c;本文笔者将从使用出发&#xff0c;解读源码&am…

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

恒创科技:云服务器公网带宽选择多少合适?有计算公式吗?

随着云计算技术的不断发展&#xff0c;越来越多的企业和个人选择使用云服务器来部署应用和存储数据。而在选择云服务器时&#xff0c;公网带宽是一个重要的参数&#xff0c;它直接影响到服务器的网络性能和数据传输速度。 公网带宽是指云服务器在互联网上的数据传输速率&#x…

内网安全:Exchange服务

目录 Exchange服务 实验环境 域横向移动-内网服务-Exchange探针 一. 端口扫描 二. SPN扫描 三. 脚本探针(还可以探针是否有安全漏洞) 域横向移动-内网服务-Exchange爆破 一 .BurpSuite Intruder模块爆破 域横向移动-内网服务-Exchange漏洞 CVE-2020-17144 Exchange R…

怎样用流程自定义表单提升办公效率?

如果想要提升办公协作效率&#xff0c;可以试试低代码技术平台及流程自定义表单工具。不可否认的是&#xff0c;随着社会的进步和发展&#xff0c;传统的表单制作工具已经没有办法再满足业务量不断上涨的办公需求了&#xff0c;但是&#xff0c;借助专业的流程自定义表单工具就…