HarmonyOS鸿蒙Next中使用AKI引入C时,C侧选择unsigned char作为入参类型,ArkTS侧选择什么参数类型作为入参

HarmonyOS鸿蒙Next中使用AKI引入C时,C侧选择unsigned char作为入参类型,ArkTS侧选择什么参数类型作为入参 问题描述: 通过 AKI 引入自定义 C 算法函数,该 C 函数接口的入参和出参均使用 unsigned char 类型, ArkTS 侧应使用什么数据类型作为入参变量,调用该 C 函数,我尝试使用Uint8Array作为入参类型,调用时会导致 C 函数读取参数时获取到空值,进而引发空指针解引用崩溃。

4 回复

C算法侧选择使用unsigned char 参数类型作为入参变量;ArkTS侧调用时,可以使用Uint8Array作为入参类型。

但是在调用时,需要注意,AKI 的 JSBind 语法糖有固定的自动处理类型转换列表,而unsigned char / unsigned char* 不在该自动转换类型范围内,这就需要我们在调用时,在cpp文件中使用调用AKI的JSBind 语法糖 aki::ArrayBuffer 作为参数类型接收,再通过static_cast<uint8_t*>将接收的指针类型参数显式地转换为 uint8_t*后,再传入C算法函数中。

ArkTS调用:

cke_1248.png

cpp文件数据转换:

cke_1248.png

更多关于HarmonyOS鸿蒙Next中使用AKI引入C时,C侧选择unsigned char作为入参类型,ArkTS侧选择什么参数类型作为入参的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


学习了

ArkTS侧应使用number类型作为入参。

在HarmonyOS Next的AKI(ArkTS Kernel Interface)中,当C侧函数使用unsigned char作为入参类型时,ArkTS侧应使用number类型作为入参,而不是Uint8Array

原因分析:

  1. unsigned char在C语言中通常用于表示一个字节的无符号整数,对应ArkTS中的number类型(具体为整数范围0-255)。
  2. Uint8Array是表示字节数组的TypedArray类型,用于传递连续的内存缓冲区数据。当C函数期望的是单个unsigned char值(标量参数)时,传递数组类型会导致类型不匹配。

正确做法:

  • 如果C函数参数是单个unsigned char值:

    // ArkTS侧
    let param: number = 128; // 0-255范围内的整数
    let result = yourCFunction(param);
    
  • 如果C函数参数是unsigned char*(指针),表示字节数组:

    // ArkTS侧
    let buffer: Uint8Array = new Uint8Array([1, 2, 3, 4]);
    let result = yourCFunction(buffer.buffer); // 传递ArrayBuffer
    

注意事项:

  1. 确保AKI接口定义中参数类型声明正确
  2. 对于数组数据,需要同时考虑数据传递和内存生命周期管理
  3. 使用AKI的NativeBuffer进行数据交互时,需遵循内存访问规范

您遇到的空指针问题正是因为将number标量参数误传为Uint8Array数组对象导致的类型不匹配。请根据C函数实际参数类型(标量还是指针)选择对应的ArkTS类型。

回到顶部