Native与TS互传自定义obj class

Native与TS互传自定义obj class

HarmonyOS
2024-05-23 21:30:51
1125浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
牙膏只用咸的

传递自定义class 对象给C,接受C返回的js 对象

1、ts 自定义对象传递给Native 侧

2、Native侧自定义对象传递给ts 侧

使用的核心API

NPI相关能力

1、napi_get_named_property

2、napi_get_named_property

核心代码解释

1、ts 侧关键代码

class defClass{ 
  public name:string = ''; 
  public age:number = 0; 
} 
  
let testObj = new defClass(); 
testObj.name = 'harmony OS'; 
testObj.age = 2024; 
let receivedObj = testNapi.sendClassToC(testObj) as defClass;   // 传递自定义class 对象给C,接受C返回的js 对象 
hilog.info(0x0000, 'testTag', 'received obj from C, name %{public}s, age %{public}d', receivedObj.name, receivedObj.age);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

2、Native 侧关键代码

// 自定义class 
class cObjTest { 
public: 
    napi_value name; 
    napi_value age; 
}; 
  
static napi_value SendClassToC(napi_env env, napi_callback_info info) { 
    // 获取参数信息 
    size_t argc = 1; 
    napi_value args[]{}; 
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  
    // 校验ts 侧传递的参数类型 
    napi_status status{}; 
    napi_valuetype valueType{}; 
    status = napi_typeof(env, args[0], &valueType); 
    if ((status != napi_ok) || (valueType != napi_object)) { 
        OH_LOG_INFO(LOG_APP, "C++ received invalid para: valuetype %{public}d", valueType); 
        return nullptr; 
    } 
  
    // new 出来的obj 需要释放 
    cObjTest *obj = new cObjTest(); 
  
    // 获取obj 对象指定字段的值:方式一 
    std::string nameStr = "name"; 
    napi_value napiNameStr{}; 
    napi_create_string_utf8(env, nameStr.c_str(), nameStr.length(), &napiNameStr); 
    status = napi_get_property(env, args[0], napiNameStr, &obj->name); 
    if (status != napi_ok) { 
        OH_LOG_INFO(LOG_APP, "C++ read name result:  %{public}d", status); 
        return nullptr; 
    } 
  
    // 获取obj 对象指定字段的值:方式二 
    status = napi_get_named_property(env, args[0], "age", &obj->age); 
    OH_LOG_INFO(LOG_APP, "C++ get age, %{public}d  %{public}f", status, obj->age); 
  
    // 创建ts对象并赋值 
    napi_value targetObj; 
    napi_create_object(env, &targetObj); 
    napi_set_named_property(env, targetObj, "name", obj->name); 
    napi_value changedAge; 
    napi_create_double(env, 2025, &changedAge); 
    napi_set_named_property(env, targetObj, "age", changedAge); 
  
    // 删除new 出来的内存 
    delete obj; 
    obj = nullptr; 
  
    return targetObj; 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.

实现效果

注明适配的版本信息

IDE版本:4.1.3.500

SDK版本:OpenHarmony 4..5.6

分享
微博
QQ
微信
回复
2024-05-24 16:13:49


相关问题
json字符串自定义class结构的转换
2830浏览 • 1回复 待解决
HarmonyOS 如何在class中显示自定义dialog
741浏览 • 1回复 待解决
ArkTS和Native互传数组类型数据
2348浏览 • 1回复 待解决
HarmonyOS native怎样调用ArkTS自定义方法
890浏览 • 1回复 待解决
自定义弹窗自定义转场动画
1919浏览 • 1回复 待解决