HarmonyOS鸿蒙Next中使用aki如何将一个包含arraybuffer的对象从ets层传递到native?

HarmonyOS鸿蒙Next中使用aki如何将一个包含arraybuffer的对象从ets层传递到native? https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-ndk-33

使用了上面链接提到的aki库,定义了一个类:

//C

typedef struct SampleAA{
  aki::ArrayBuffer ab;
};

//ets

export class SampleAA{
  ab:ArrayBuffer
}

已经按aki的文档,使用

JSBIND_CLASS(SampleAA)
{
    JSBIND_PROPERTY(ab);
}

绑定。

现在在native侧可以将一个SampleAA对象穿到ets层调用,但是当在ets层构建一个SampleAA对象传递给native侧时,无法成功,直接报cppcrash跳出

SIGSEGV(SEGV_MAPERR)@000000000000000000 probably caused by NULL pointer dereference


更多关于HarmonyOS鸿蒙Next中使用aki如何将一个包含arraybuffer的对象从ets层传递到native?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,使用AKI将包含ArrayBuffer的对象从ETS层传递到Native层,可通过序列化实现。在ETS侧,将对象转换为Native可识别的数据格式,如使用AKI的序列化接口将ArrayBuffer转为字节数组。在Native侧,通过AKI的反序列化接口接收并解析数据,重建ArrayBuffer对象。需确保ETS与Native间的数据类型映射一致,并遵循AKI跨语言调用规范。

更多关于HarmonyOS鸿蒙Next中使用aki如何将一个包含arraybuffer的对象从ets层传递到native?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中通过AKI传递包含ArrayBuffer的对象时,需要确保ArrayBuffer在native层正确初始化。从错误信息看,是空指针解引用导致的崩溃,这通常是因为ets层创建的ArrayBuffer在native层没有正确映射。

关键点在于:AKI的aki::ArrayBuffer需要显式绑定到ets的ArrayBuffer类型。你需要在JSBIND_CLASS中为ab字段添加类型绑定:

JSBIND_CLASS(SampleAA)
{
    JSBIND_PROPERTY(ab, JSBIND_TYPE(aki::ArrayBuffer));
}

同时,在ets层创建对象时,需要确保ArrayBuffer已正确实例化:

let sample = new SampleAA();
sample.ab = new ArrayBuffer(1024); // 必须分配内存

在native层接收时,需要检查ArrayBuffer有效性:

void YourFunction(SampleAA& obj) {
    if (obj.ab.data() == nullptr) {
        // 处理空ArrayBuffer情况
        return;
    }
    // 安全访问数据
    uint8_t* data = static_cast<uint8_t*>(obj.ab.data());
    size_t size = obj.ab.size();
}

如果问题仍然存在,检查AKI版本是否匹配,并确保ets和native层的类型定义完全一致。ArrayBuffer在跨语言边界传递时,AKI会管理内存生命周期,但需要两端都正确声明类型。

回到顶部