HarmonyOS 鸿蒙Next native回调到ts层的object ts层如何获取其成员变量 提供demo

发布于 1周前 作者 vueper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next native回调到ts层的object ts层如何获取其成员变量 提供demo

  1. 目前我们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);
}

请问:

  1. ts层如何访问native层返回的argv[1]这个object?
  2. 如果需要ts层再将这个argv[1]对应的object(ts层可能修改这个object中的成员变量/键值对),需要再次返回填充到result中,ts层该如何处理?
  3. 如果不使用这种类似键值对的形式,native层如何对object赋值,并实现2中的功能?

更多关于HarmonyOS 鸿蒙Next native回调到ts层的object ts层如何获取其成员变量 提供demo的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

用具体类型如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)层时,若需要传递一个对象并获取其成员变量,可以通过以下方式进行实现。以下是一个简化的示例说明:

  1. Native层:在Native层创建一个结构体或类,并填充数据。然后,通过JNI(Java Native Interface,虽然要求不回答Java相关内容,但此处仅作为概念说明,实际鸿蒙开发中会使用对应的原生接口)或其他方式将对象传递到JS/TS层。鸿蒙系统中,这通常通过特定的跨语言调用机制完成。

  2. JS/TS桥接层:在鸿蒙的JS/TS环境中,接收从Native层传递过来的对象。该对象会被转换为一个JavaScript对象,其成员变量可以通过标准的JS/TS属性访问方式获取。

  3. 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,

回到顶部