ArkTS侧如何接收Native侧的键值对进行修改并返回到Native侧

ArkTS侧如何接收Native侧的键值对进行修改并返回到Native侧

HarmonyOS
2024-03-19 16:33:21
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
chunter

1. 用具体类型如Record<string, number>、map<string, number>接收后修改数据。

2. 在ArkTS侧的函数中返回修改后的数据,在Native层通过napi_call_function可以获取到修改的数据。

3. Native侧针对object的赋值,目前只能通过napi_set_property对属性进行设置。

示例代码如下:

ArkTS侧

// index.ets 
import testNapi from 'libentry.so'; 
... 
build() { 
... 
  .onClick(() => { 
    let data: Record<string, number> = testNapi.callbackToArkTS((value: object) => { 
      let obj: Record<string, number> = value as Record<string, number>; 
      console.info("pre type:" + obj["type"].toString()) 
      console.info(JSON.stringify(value)) 
      obj["type"] += 10; 
      return value; 
    }); 
    console.info(JSON.stringify(data)) 
  }) 
}

Native侧

#include "napi/native_api.h" 
#include "hilog/log.h" 
#undef LOG_DOMAIN 
#undef LOG_TAG 
#define LOG_DOMAIN 0x3200 
#define LOG_TAG "MY_TAG" 
 
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) { 
    size_t argc = 1; 
    napi_value args[1] = {nullptr}; 
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
    // native回调到ArkTS层的object 
    napi_value argv = nullptr; 
    napi_create_object(env, &argv); 
    Napi_AddPropertyInt32(env, argv, "type", 1); 
    Napi_AddPropertyInt32(env, argv, "index", 2); 
    // native回调到ArkTS层 
    napi_value result = nullptr; 
    napi_call_function(env, NULL, args[0], 1, &argv, &result); 
    // 获取ArkTS修改后的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, "ArkTS侧修改后的type:%{public}d", number); 
    // 返回修改后的object 
    return result; 
} 
EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
    napi_property_descriptor desc[] = { 
        { "callbackToArkTS", nullptr, CallbackToArkTS, nullptr, nullptr, nullptr, napi_default, nullptr } 
    }; 
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
    return exports; 
} 
EXTERN_C_END 
...

index.d.ts

export const callbackToArkTS: (a: object) => Record<string, number>
分享
微博
QQ
微信
回复
2024-03-20 00:21:19
相关问题
arktshashmap转为native
501浏览 • 1回复 待解决
ArkTSNative如何进行map数据交互
1049浏览 • 1回复 待解决
Native调用ArkTS类函数
409浏览 • 1回复 待解决
如何Native释放ArkTS对象
1169浏览 • 1回复 待解决
Native进行跨模块加载
272浏览 • 1回复 待解决
Native释放ArkTS对象方法
62浏览 • 1回复 待解决
TS如何批量传递函数到native
436浏览 • 1回复 待解决
Native如何打印char指针
824浏览 • 1回复 待解决
Native调用ArkTS全局普通方法
431浏览 • 1回复 待解决
nativelog获取不到
747浏览 • 1回复 待解决
如何Native构建一个ArkTS对象
929浏览 • 1回复 待解决
native创建file保存进沙箱路径
586浏览 • 1回复 待解决
native如何调用类静态方法?
668浏览 • 1回复 待解决
native如何使用类静态方法
511浏览 • 1回复 待解决
如何Native获取APP版本信息
1081浏览 • 1回复 待解决
Native如何获取可操作文件目录
875浏览 • 1回复 待解决
Native创建线程是否有限制
1086浏览 • 1回复 待解决