AIDL中的传参及in、out、inout

简介: 今天开发AIDL,新建一个接口,写了一个函数,结果build的时候报错了Process 'command 'xxx/aidl'' finished with non-zero exit value 1经过长时间的尝试终于搞定,期间也回顾了不少知识,一起总结一下。

前言


今天开发AIDL,新建一个接口,写了一个函数,结果build的时候报错了

Process 'command 'xxx/aidl'' finished with non-zero exit value 1

经过长时间的尝试终于搞定,期间也回顾了不少知识,一起总结一下。


AIDL默认支持的数据类型


来看看IData.aidl的源码:


package jun.server;
// Declare any non-default types here with import statements
interface IBaseData {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    // 不支持short类型
    void basicTypes(byte aByte, int anInt, long aLong,
            boolean aBoolean,
            float aFloat, double aDouble,
            char aChar,
            String aString, CharSequence aCharSequence,
            inout List<String> aList);
}
复制代码


除short外的Java八大基本数据类型,String、CharSequence、以及List。当我们传入的参数不是这些类型时,就会报错。还有一些情况:

  • list的元素类型不能是基本类型,比如List<Long>List<Byte>
  • 缺少import会报错。aidl不会自动import,所以需要我们手动添加,添加时由于没有提示,一定要注意正确


in\out\inout


有些类型缺少in\out\inout标签,也会报错。比如:

  • list类型的参数,如List<String>
  • 基本类型的数组,如byte[]
  • Parcelable的实现类,如Bundle


那么这三个标签有什么作用?

  • in 表示数据只能由客户端流向服务端
  • out 表示数据只能由服务端流向客户端
  • inout 则表示数据可在服务端与客户端之间双向流通。


其中,数据流向是针对在客户端中的那个传入方法的对象而言的。

  • in 为定向 tag 的话表现为服务端将会接收到一个那个对象的完整数据,但是客户端的那个对象不会因为服务端对传参的修改而发生变动;
  • out 的话表现为服务端将会接收到那个对象的的空对象,但是在服务端对接收到的空对象有任何修改之后客户端将会同步变动;
  • inout 为定向 tag 的情况下,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动。


举例说一下:

如果将一个参数设为out,客户端调用该函数并传入了一个对象数据,但是服务端接受到的是一个空对象,但是服务端可以为这个对象赋值,赋值后客户端那边的对象也会跟着改变。


自定义类


自定义类后,在aidl需要添加对应文件,否则报错。

有时我们需要传递一些复杂数据,需要自定义一个类,这个类必须实现Parcelable。这个类必须在客户端和服务端都有一份。

然后我们在aidl的函数中使用这个类型的参数,但是依然报错,已经添加import也报错。

是因为我们需要在aidl中添加一个对应的文件

比如


package cn.xxx.xxx;
public class Product implements Parcelable {
    ...
}
复制代码


在aidl接口中


package com.xxx.xxx;
//注意:这里有一个巨坑,这包名不能加aidl。不然会报错
import com.xxx.xxxx.Product;
interface IMyAidlInterface {
    void do(in String country, in Product product);
}
复制代码


这里不仅添加了import,而且也为该类型添加了in标签,但是依然报错。

这就需要在aidl目录下添加一个对应的文件,如下


package com.xxx.xxxx;
parcelable Product;
复制代码

注意包名要一样。


传参是回调


传参可以是一个回调,这个回调实际上也是一个aidl接口,比如


package cn.xxx.xxx;
import cn.xxx.xxx.Callback;
interface IMyInterface {
    void setCallback(Callback callback);
}
复制代码


CallBack文件


package cn.xxx.xxx;
interface Callback {
    void onDone(inout byte[] data, int length, int width, int height, int code);
}
复制代码


这个callback也是一个aidl,不能是普通的接口,所以他的传参也需要遵循上面的约束


目录
相关文章
|
算法 计算机视觉
数字图像处理实验(四)|图像压缩与编码实验{JPGE编码、离散余弦变换DCT、图像分块dctmtx|blkproc}(附matlab实验代码和截图)
数字图像处理实验(四)|图像压缩与编码实验{JPGE编码、离散余弦变换DCT、图像分块dctmtx|blkproc}(附matlab实验代码和截图)
1266 0
数字图像处理实验(四)|图像压缩与编码实验{JPGE编码、离散余弦变换DCT、图像分块dctmtx|blkproc}(附matlab实验代码和截图)
|
11月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
API Android开发 容器
33. 【Android教程】悬浮窗:PopupWindow
33. 【Android教程】悬浮窗:PopupWindow
1839 2
|
4月前
|
人工智能 文字识别 小程序
告别手动录入!AI自动识别发票
最近有朋友向我吐槽:"每天对着几十张发票手动录入系统,眼睛都快看花了,还总担心数字打错。" 这种重复性高、容错率低的工作,确实让财务和行政人员苦不堪言。作为程序员,我深知这类场景完全可以通过技术手段优化
186 0
|
9月前
|
人工智能 搜索推荐 Android开发
Android系统版本演进:从1.0到最新,见证移动操作系统的蜕变####
本文以Android系统的迭代更新为线索,探讨了自2008年首个版本发布以来,Android在功能、性能、用户体验及安全性方面的显著进步。通过对比各代版本的亮点与改进,揭示了Android如何逐步发展成为全球领先的移动操作系统平台,并预测了未来发展趋势。 ####
723 24
|
Java Linux API
统计android设备的网络数据使用量
统计android设备的网络数据使用量
401 0
|
11月前
|
安全 大数据 数据挖掘
大数据时代,数据安全管理的问题与对策
无论是从企业还是个人的需求出发,考取一个大数据管理相关的证书都是最好的选择,不仅能提升大数据管理能力、意识和素质,还能获得更高的市场信誉与认可。
|
前端开发 Java 编译器
Android HAL深入探索(7)hidl-gen和hidl2aidl的使用详解
Android HAL深入探索(7)hidl-gen和hidl2aidl的使用详解
2187 0
|
Cloud Native 安全 物联网
【阿里云云原生专栏】云边端一体化:阿里云如何利用云原生技术赋能物联网
【5月更文挑战第22天】阿里云借助云原生技术赋能物联网,实现云边端一体化,提升系统弹性与敏捷性。通过容器化部署,保证高可用性与可靠性。在智能交通等领域,阿里云提供高效解决方案,实现实时数据分析与决策。代码示例展示如何使用阿里云服务处理物联网数据。同时,阿里云重视数据安全,采用加密和访问控制保障数据隐私。丰富的工具和服务支持开发者构建物联网应用,推动技术广泛应用与发展。
565 1

热门文章

最新文章