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 函数读取参数时获取到空值,进而引发空指针解引用崩溃。
C算法侧选择使用unsigned char 参数类型作为入参变量;ArkTS侧调用时,可以使用Uint8Array作为入参类型。
但是在调用时,需要注意,AKI 的 JSBind 语法糖有固定的自动处理类型转换列表,而unsigned char / unsigned char* 不在该自动转换类型范围内,这就需要我们在调用时,在cpp文件中使用调用AKI的JSBind 语法糖 aki::ArrayBuffer 作为参数类型接收,再通过static_cast<uint8_t*>将接收的指针类型参数显式地转换为 uint8_t*后,再传入C算法函数中。
ArkTS调用:

cpp文件数据转换:

更多关于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。
原因分析:
unsigned char在C语言中通常用于表示一个字节的无符号整数,对应ArkTS中的number类型(具体为整数范围0-255)。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
注意事项:
- 确保AKI接口定义中参数类型声明正确
- 对于数组数据,需要同时考虑数据传递和内存生命周期管理
- 使用AKI的NativeBuffer进行数据交互时,需遵循内存访问规范
您遇到的空指针问题正是因为将number标量参数误传为Uint8Array数组对象导致的类型不匹配。请根据C函数实际参数类型(标量还是指针)选择对应的ArkTS类型。

