场景说明:
我们经常在ArkTS与C++之间相互传递参数,那么具体该如何传呢?下面介绍了几个常用的场景:
场景一:string类型传递
调用接口:
napi_get_value_string_utf8
实现能力:
通过 napi_get_value_string_utf8 获取字符串长度,然后根据长度将从 ArkTS 侧传过来的 napi_value 转换成字符串。
注意:
C++里字符串结尾是\0,所以转换成字符串时长度为stringSize + 1。
核心代码解释
Index.ets文件向C++层传递string数据。
let str:string = 'hello!';
testNapi.putString(str);
将value转成字符串返回,注意C++里字符串结尾是\0,所以转换成字符串时长度为stringSize + 1。
static std::string value2String(napi_env env, napi_value value) {
size_t stringSize = 0;
napi_get_value_string_utf8(env, value, nullptr, 0, &stringSize); // 获取字符串长度
std::string valueString;
valueString.resize(stringSize + 1);
napi_get_value_string_utf8(env, value, &valueString[0], stringSize + 1, &stringSize); // 根据长度传换成字符串
return valueString;
}
C++层获取string数据。
static napi_value ts_putString(napi_env env, napi_callback_info info){
size_t argc = 1;
napi_value args[1] = {nullptr};
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
napi_value str = args[0];//args[0]->string
std::string stringValue = value2String(env, str);//将 str 转换成 string 类型
OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, LOG_TAG, "ts_putString str = %{public}s", stringValue.c_str());
return nullptr;
}
实现效果
场景二:arraybuffer类型的传递
调用接口:
-
ArkTS传递给C++,解析ArrayBuffer
napi_get_typedarray_info、napi_get_arraybuffer_info
-
C++传递给ArkTS,构建ArrayBuffer
napi_create_arraybuffer、napi_create_typedarray
实现能力:
实现了 ArkTS 与 Native C++ 之间相互传递 arraybuffer。
Native C++ 侧接受传入的 ArkTS Array,通过 napi_get_typedarray_info 将获取到的数据传入数组 typedarray 生成 input_buffer ,然后通过 napi_get_arraybuffer_info 获取数组数据。
ArkTS 侧 接收 Native C++ 侧返回的 Array,通过 napi_create_arraybuffer 创建一个 arraybuffer 数组,根据创建的 arraybuffer 通过 napi_create_typedarray 创建一个 typedarray 并将 arraybuffer 存入 output_array,然后给 arraybuffer 赋值,最后返回 output_array。
核心代码解释
Index.ets
@Entry
@Component
struct Index {
napiArray?:Int32Array
build() {
Row() {
Column() {
Button("NAPI2TS")//接收Native侧返回的Array
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
this.napiArray= testNapi.NAPI2TS()
for(let num of this.napiArray) {
console.info("NAPI2TS: JS " + num.toString())
}
})
Button("TS2NAPI")//向Native侧传入Array
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
if(this.napiArray){
testNapi.TS2NAPI(this.napiArray)
for(let num of this.napiArray) {
console.info("TS2NAPI: JS " + num.toString())
}
}
})
}
.width('100%')
}
.height('100%')
}
}
Native侧接受传入的 ArkTS Array
static napi_value TS2NAPI(napi_env env, napi_callback_info info)
{
// 获取TS层传来的参数
size_t argc = 1;
napi_value args;
napi_get_cb_info(env, info, &argc, &args, NULL, NULL);
napi_value input_array = args;
// 获取传入数组typedarray生成input_buffer
napi_typedarray_type type;// 数据类型
napi_value input_buffer;
size_t byte_offset;//数据偏移
size_t i, length;//数据字节大小
napi_get_typedarray_info(env, input_array, &type, &length, NULL, &input_buffer, &byte_offset);
// 获取数组数据
void *data;
size_t byte_length;
napi_get_arraybuffer_info(env, input_buffer, &data, &byte_length);
// 遍历数组
if (type == napi_int32_array) {
int32_t *data