我的编程空间,编程开发者的网络收藏夹
学习永远不晚

[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

AIDL文件在Android系统上应用广泛,和底层的Binder机制紧密关联。
在Android源码或者Android Studio中通常是自动编译aidl文件,生成对应语言的接口文件。
做应用层Java开发,aidl和binder封装的比较“干净”,不用太多的涉及binder的调用细节,也不用太关心aidl的编译过程。
如果是做中下层开发,包括framework、native层开发,可能需要编写native service,有必要理解binder的底层机制。

先从编译aidl开始。这里只说明编译aidl生成各种类型后端接口文件的过程。生成的接口文件内容再写文章单独介绍。

以下演示是在Ubuntu系统上测试的。

一、准备

1. aidl编译工具

即aidl命令,Android sdk或者Android源码中都有。

sdk中aidl,需要把路径添加到path中。
位置:~/Android/Sdk/build-tools/33.0.2/aidl

源码中aidl,设置源码编译环境后,自动添加到path中。
位置:out/soong/host/linux-x86/bin/aidl

2. 演示用的aidl文件

写2个简单的aidl文件,一个是服务接口,一个是回调接口。可用覆盖大部分的实际场景。
文件目录结构和文件内容如下。

$ tree ..└── aidl    └── com        └── my            └── pkg                ├── IMyServiceCallback.aidl                └── IMyServiceInterface.aidl

回调接口定义:

// IMyServiceCallback.aidlpackage com.my.pkg; interface IMyServiceCallback {    void onEvent(int code, String message);}

服务接口定义:

// IMyServiceInterfacepackage com.my.pkg;interface IMyServiceInterface {    int doSomething(in String str, int num);    void setCallBack(com.my.pkg.IMyServiceCallback callback);}

二、生成Java接口

执行如下命令,生成Java接口文件。
说明:

  1. aidl使用说明
    aidl --lang={java|cpp|ndk} [options] input_aidl_file。
    在命令行中,aidl不带任何参数,打印使用说明。
  2. –lang={java|cpp|ndk}
    指定生成接口类型。如果不指定,默认生成Java文件。
  3. -o 指定输出目录
    Java:省略-o参数,java文件生成到aidl文件目录下。
    C++/Rust:必选参数。
    为了清除查看效果,指定到单独的目录:-o ./java
  4. -I DIR, --include=DIR
    import搜索路径,指定依赖的aidl文件所在目录。不是C++头文件目录。
    例如:IMyServiceInterface.aidl引用了IMyServiceCallback.aidl,在生成IMyServiceInterface.aidl的时候需要指定-I参数才能正常编译。
    只要是AIDL文件中有依赖,生成任何类型的接口(Java、C++、Rust)都要指定这个参数。
# 前2条命令效果相同,不指定--lang参数,默认生成Java文件$ aidl -o ./java --lang=java aidl/com/my/pkg/IMyServiceCallback.aidl $ aidl -o ./java aidl/com/my/pkg/IMyServiceCallback.aidl $ aidl -I ./aidl/ -o ./java aidl/com/my/pkg/IMyServiceInterface.aidl$ tree .├── aidl│   └── com│       └── my│           └── pkg│               ├── IMyServiceCallback.aidl│               └── IMyServiceInterface.aidl└── java    └── com        └── my            └── pkg                ├── IMyServiceCallback.java                └── IMyServiceInterface.java

三、生成C++[Android]接口

  1. cpp和ndk的区别
    cpp:生成的代码是为了在Android源码中编译,代码中会调用Android源码中的native接口。
    例如,引用的头文件:

    ndk:生成的代码是为了使用ndk独立编译,调用的是ndk的接口,
    例如,引用的头文件:

  2. –lang=cpp,参数指定生成Android源码下编译的C++接口文件。

  3. -o和-h参数分别指定.cpp文件和.h文件输出的路径。可以指定不同的目录。
    1)C++接口文件比较多,一个aidl文件生成4个文件。第一步编译IMyServiceCallback.aidl后,生成文件包括:
    3个头文件:
    一个Interface头文件:IMyServiceCallback.h
    一个Bp头文件:BpMyServiceCallback.h
    一个Bn头文件:BnMyServiceCallback.h
    一个源码文件:IMyServiceCallback.cpp

$ aidl -h ./cpp_android/ -o ./cpp_android --lang=cpp aidl/com/my/pkg/IMyServiceCallback.aidl$ tree .├── aidl│   └── com│       └── my│           └── pkg│               ├── IMyServiceCallback.aidl│               └── IMyServiceInterface.aidl└── cpp_android    └── com        └── my            └── pkg                ├── BnMyServiceCallback.h                ├── BpMyServiceCallback.h                ├── IMyServiceCallback.cpp                └── IMyServiceCallback.h$ aidl -I ./aidl/ -h ./cpp_android/ -o ./cpp_android --lang=cpp aidl/com/my/pkg/IMyServiceInterface.aidl$ tree .├── aidl│   └── com│       └── my│           └── pkg│               ├── IMyServiceCallback.aidl│               └── IMyServiceInterface.aidl└── cpp_android    └── com        └── my            └── pkg                ├── BnMyServiceCallback.h                ├── BnMyServiceInterface.h                ├── BpMyServiceCallback.h                ├── BpMyServiceInterface.h                ├── IMyServiceCallback.cpp                ├── IMyServiceCallback.h                ├── IMyServiceInterface.cpp                └── IMyServiceInterface.h

四、生成C++[ndk]接口

除了–lang=ndk指定生成ndk后端接口,过程和结果都和cpp类似。

$ aidl -I ./aidl/ -h ./cpp_ndk -o ./cpp_ndk --lang=ndk aidl/com/my/pkg/IMyServiceInterface.aidl $ aidl -h ./cpp_ndk -o ./cpp_ndk --lang=ndk aidl/com/my/pkg/IMyServiceCallback.aidl $ tree cpp_*cpp_android└── com    └── my        └── pkg            ├── BnMyServiceCallback.h            ├── BnMyServiceInterface.h            ├── BpMyServiceCallback.h            ├── BpMyServiceInterface.h            ├── IMyServiceCallback.cpp            ├── IMyServiceCallback.h            ├── IMyServiceInterface.cpp            └── IMyServiceInterface.hcpp_ndk├── aidl│   └── com│       └── my│           └── pkg│               ├── BnMyServiceCallback.h│               ├── BnMyServiceInterface.h│               ├── BpMyServiceCallback.h│               ├── BpMyServiceInterface.h│               ├── IMyServiceCallback.h│               └── IMyServiceInterface.h└── com    └── my        └── pkg            ├── IMyServiceCallback.cpp            └── IMyServiceInterface.cpp

五、生成Rust接口文件

  1. –lang=rust指定生成rust后端接口文件。
  2. 只需通过-o参数设置输出路径即可,输出结果和Java类似,一个aidl文件对应一个.rs文件。
  3. Rust后端是比较新版本的aidl才支持的,可能是Android 12以后,可以查看aidl命令帮助确认。
$ aidl -o ./rust --lang=rust aidl/com/my/pkg/IMyServiceCallback.aidl $ aidl -I ./aidl/ -o ./rust --lang=rust aidl/com/my/pkg/IMyServiceInterface.aidl$ tree .├── aidl│   └── com│       └── my│           └── pkg│               ├── IMyServiceCallback.aidl│               └── IMyServiceInterface.aidl└── rust    └── com        └── my            └── pkg                ├── IMyServiceCallback.rs                └── IMyServiceInterface.rs

来源地址:https://blog.csdn.net/yinminsumeng/article/details/129324917

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

[Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

AIDL文件在Android系统上应用广泛,和底层的Binder机制紧密关联。 在Android源码或者Android Studio中通常是自动编译aidl文件,生成对应语言的接口文件。 做应用层Java开发,aidl和binder封装的比
2023-08-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录