中国优质的IT技术网站
专业IT技术创作平台
IT职业在线教育平台
如何实现ArkTS与C/C++的对象传递
微信扫码分享
ArkTS类对象传递至NAPI侧;
NAPI获取对象属性并输出;
NAPI调用对象方法。
// Animals类 class Animals { name: string age: number constructor(name: string, age: number) { this.name = name; this.age = age; } add(a: number, b: number): number { return a + b; } } // ArkTS传递对象中 Button("TestObject") .onClick(() => { let ani:Animals = new Animals('Bob',5) testNapi.TestObject(ani) }) // NAPI接受对象并处理 static napi_value TestObject(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 name, age; napi_get_named_property(env, args[0], "name", &name); napi_get_named_property(env, args[0], "age", &age); size_t itemLength; napi_get_value_string_utf8(env, name, nullptr, 0, &itemLength); char *str = new char[itemLength + 1]; napi_get_value_string_utf8(env, name, &str[0], itemLength + 1, &itemLength); OH_LOG_INFO(LOG_APP, "name is %{public}s", str); uint32_t num; napi_get_value_uint32(env, age, &num); OH_LOG_INFO(LOG_APP, "age is %{public}d", num); napi_value add; napi_get_named_property(env, args[0], "add", &add); // 创建参数数组 napi_value arr[2]; napi_create_int32(env, 10, &arr[0]); napi_create_int32(env, 5, &arr[1]); napi_value result; uint32_t res; napi_call_function(env, args[0], add, 2, arr, &result); napi_get_value_uint32(env, result, &res); OH_LOG_INFO(LOG_APP, "res is %{public}d", res); return nullptr; }
ArkTS侧传递回调方法到NAPI侧;
NAPI创建napi_value指针类型的对象作为参数传递到回调方法;
ArkTS调用回调方法获取NAPI侧传入的参数并做修改;
NAPI侧获取修改后的参数并输出。
Button("CallbackToArkTs") .onClick(() => { let da: Record<string, number> = testNapi.CallbackToArkTs((value: object) => { let data: Record<string, number> = value as Record<string, number>; console.info("修改前type: " + data["type"].toString()) console.info(JSON.stringify(value)) data["type"] += 10 return value; }); console.info(JSON.stringify(da)) }) static bool Napi_AddPropertyInt32(napi_env env, napi_value obj, const char *key, int32_t value) { napi_value key_napi = nullptr; napi_status status = napi_create_string_utf8(env, key, NAPI_AUTO_LENGTH, &key_napi); napi_value value_napi = nullptr; status = napi_create_int32(env, value, &value_napi); status = napi_set_property(env, obj, key_napi, value_napi); return true; } static napi_value CallbackToArkTs(napi_env env, napi_callback_info info) { // 获取ArkTS参数 size_t argc = 1; napi_value js_cb = nullptr; napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr); // native回调到ts层的object napi_value argv = nullptr; napi_create_object(env, &argv); Napi_AddPropertyInt32(env, argv, "type", 1); Napi_AddPropertyInt32(env, argv, "index", 2); // native回调到ts层 napi_value result = nullptr; napi_call_function(env, NULL, js_cb, 1, &argv, &result); // 获取ts修改后的object napi_value typeNumber = nullptr; napi_get_named_property(env, result, "type", &typeNumber); int32_t number; napi_get_value_int32(env, typeNumber, &number); OH_LOG_INFO(LOG_APP, "修改后type: %{public}d", number); // 返回修改后的object return result; }
ArkTS类对象传递至NAPI侧;
NAPI获取对象属性并输出;
NAPI调用对象方法。
ArkTS侧传递回调方法到NAPI侧;
NAPI创建napi_value指针类型的对象作为参数传递到回调方法;
ArkTS调用回调方法获取NAPI侧传入的参数并做修改;
NAPI侧获取修改后的参数并输出。