解决Android11上无法通过AIDL传递MQDescriptor从而无法使用FMQ快速消息队列的方法

前言

在使用FMQ快速消息队列时,一端创建了消息队列后,需要获得MQDescriptorSync 或 MQDescriptorUnsync 对象并传递给另一端。另一端通过Descriptor再创建对应的消息队列便可以进行夸进程的消息传输。
目前google官方提供的FMQ使用的方式要么是
1、通过hidl传输Descriptor。
2、要么是在Android 12以上通过aidl传输Descriptor。
并未提供Android11上FMQ快速消息队列与AIDL搭配使用的方法。
近期因为平台是Android11的,因此实现了在Android11上FMQ快速消息队列与AIDL的搭配使用。有类似情况的朋友可以参考。

一、Google提供的Descriptor传输方式

MQDescriptorSync 或 MQDescriptorUnsync 对象的传输有2种方式。

1、通过 HIDL进行传输

可以参考
快速消息队列 (FMQ)
在 .hal 文件中,为该方法提供一个类型为 fmq_sync 或 fmq_unsync 的参数,其中 T 是 HIDL 定义的一种合适类型。使用此方法将 getDesc() 返回的对象发送到接收进程。例如:

解决Android11上无法通过AIDL传递MQDescriptor从而无法使用FMQ快速消息队列的方法_第1张图片

2、通过 AIDL进行传输

快速消息队列与AIDL
解决Android11上无法通过AIDL传递MQDescriptor从而无法使用FMQ快速消息队列的方法_第2张图片
该方法的局限是在Android 12开始才有,之前的Android版本则不具备。

二、Android11上FMQ快速消息队列与AIDL的搭配使用

Descriptor无法直接通过AIDL进行传输,我们也不想通过HIDL进行传输。因此考虑传输Descriptor的native_handle_t对象,对端拿到native_handle_t之后,再还原对应的Descriptor。
从MQDescriptor的定义来看,是可以通过native_handle_t来得到MQDescriptor的

inline ::native_handle_t *handle() {
   
        return mHandle;
    }

MQDescriptor(size_t bufferSize, native_handle_t* nHandle,
                 size_t messageSize, bool configureEventFlag = false);

aidl也无法传输非基本数据类型,因此对于native_handle_t对象,我们也无法直接传输。aidl是可以传输序列化的对象的,因此这里我们考虑将native_handle_t转化为一个序列化的类型。

typedef struct native_handle
{
   
    int version;        /* sizeof(native_handle_t) */
    int numFds;         /* number of file-descriptors at &data[0] */
    int numInts;        /* number of ints at &data[numFds] */
    int data

你可能感兴趣的:(c++,android)