native回调到ts层的object,ts层获取其成员变量

native回调到ts层的object,ts层获取其成员变量

HarmonyOS
2024-05-23 22:00:29
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
sheeny2000

一、背景

1. native中使用napi_create_object新建object,并通过 napi_create_string_utf8 和 napi_create_int32建立键值对,通过napi_set_property(env, object, key, value)的方式存放,并回调传给ts层。

2. ts层将回调获取到的object修改(ts层可能修改这个object中的成员变量/键值对),需要再次返回填充到Native层result中。

3. ts层获得native函数返回值,返回值为修改后的object。

二、相关接口

1. napi_create_object 创建一个默认的js Object。

2. napi_set_property 对给定Object设置属性。

3. napi_get_named_property 获取给定Object中指定名称的属性。

4. napi_call_function 在Native方法中调用js function,即native call js。

三、相关代码

Native层回调JS层函数

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; 
}

给object设置属性

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; 
}

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)) 
    })

index.d.ts

export const CallbackToArkTs: (a: object) => Record<string, number>;
分享
微博
QQ
微信
回复
2024-05-24 21:47:06
相关问题
如何在native获取屏幕亮度
525浏览 • 1回复 待解决
ts给c++传递数组,c++如何解析
465浏览 • 1回复 待解决
如何在Native加载so库
429浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
438浏览 • 1回复 待解决
native如何访问rawfile二进制文件
702浏览 • 1回复 待解决
ArkTS获取对象所有方法
435浏览 • 1回复 待解决
worker.ts中如何获取context
644浏览 • 2回复 待解决
TS侧如何批量传递函数到native
344浏览 • 1回复 待解决
NativeTS互传自定义obj class
451浏览 • 1回复 待解决