HarmonyOS 鸿蒙Next native回调到ts层的object ts层如何获取其成员变量 提供demo
HarmonyOS 鸿蒙Next native回调到ts层的object ts层如何获取其成员变量 提供demo
- 目前我们native层在回调中使用napi_create_object新建object,并通过 napi_create_string_utf8 和 napi_create_int32建立键值对,通过napi_set_property(env, object, key, value)的方式存放,并回调传给ts层。主要代码如下:
bool Napi_AddPropertyInt32(napi_env env, napi_value obj, const char* key, int32_t value) {
napi_value key_napi = NULL;
napi_status status = napi_create_string_utf8(env, key, NAPI_AUTO_LENGTH, &key_napi);
napi_value value_napi = NULL;
status = napi_create_int32(env, value, &value_napi);
status = napi_set_property(env, obj, key_napi, value_napi);
return true;
}
void CallbackToArkTs(napi_env env, napi_value cb, void *context, void *data) {
napi_status status;
napi_value argv[2] = {NULL, NULL};
status = napi_create_int32(env, static_cast<int32_t>(*info)->what), &argv[0]);
status = napi_create_object(env, &argv[1]);
Napi_AddPropertyInt32(env, argv[1], "type", 1);
Napi_AddPropertyInt32(env, argv[1], "index", 2);
napi_get_reference_value(env, callback_ref, &cb);
napi_value result = NULL;
napi_call_function(env, NULL, cb, 2, argv, &result);
}
请问:
- ts层如何访问native层返回的argv[1]这个object?
- 如果需要ts层再将这个argv[1]对应的object(ts层可能修改这个object中的成员变量/键值对),需要再次返回填充到result中,ts层该如何处理?
- 如果不使用这种类似键值对的形式,native层如何对object赋值,并实现2中的功能?
更多关于HarmonyOS 鸿蒙Next native回调到ts层的object ts层如何获取其成员变量 提供demo的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
用具体类型如Record<string, number>
、map<string, number>
接收后访问。
在ts的函数中返回修改后的数据,在native层napi_call_function的result可以获取到修改的数据。
针对object的赋值,目前只能通过napi_set_property等对属性设置。
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: %d", number);
// 返回修改后的object
return result;
}
// index.d.ts
export const CallbackToArkTs: (a: object) => Record<string, number>;
// ts层
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))
})
更多关于HarmonyOS 鸿蒙Next native回调到ts层的object ts层如何获取其成员变量 提供demo的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS(鸿蒙)系统中,当从Native层回调到TypeScript(TS)层时,若需要传递一个对象并获取其成员变量,可以通过以下方式进行实现。以下是一个简化的示例说明:
-
Native层:在Native层创建一个结构体或类,并填充数据。然后,通过JNI(Java Native Interface,虽然要求不回答Java相关内容,但此处仅作为概念说明,实际鸿蒙开发中会使用对应的原生接口)或其他方式将对象传递到JS/TS层。鸿蒙系统中,这通常通过特定的跨语言调用机制完成。
-
JS/TS桥接层:在鸿蒙的JS/TS环境中,接收从Native层传递过来的对象。该对象会被转换为一个JavaScript对象,其成员变量可以通过标准的JS/TS属性访问方式获取。
-
TS层:在TS层中,定义一个与Native层对象结构对应的接口或类型(使用TypeScript的类型系统),然后直接访问传递过来的对象的成员变量。
示例代码(简化版,具体实现需根据鸿蒙API调整):
// 假设Native层传递了一个对象,其结构在TS中定义为
interface NativeObject {
member1: string;
member2: number;
}
// 在JS/TS环境中接收并处理对象
function handleNativeObject(nativeObj: NativeObject) {
console.log(nativeObj.member1); // 访问成员变量
console.log(nativeObj.member2);
}
// 调用示例(实际调用方式需根据鸿蒙框架提供的API)
// handleNativeObject({ member1: "value1", member2: 123 });
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html,