Native与TS互传自定义obj class

Native与TS互传自定义obj class

HarmonyOS
2024-05-23 21:30:51
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
hujianwu

传递自定义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);

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

实现效果

注明适配的版本信息

IDE版本:4.1.3.500

SDK版本:OpenHarmony 4..5.6

分享
微博
QQ
微信
回复
2024-05-24 16:13:49
相关问题
json字符串自定义class结构的转换
554浏览 • 1回复 待解决
自定义弹窗自定义转场动画
390浏览 • 1回复 待解决
ArkTS和Native互传数组类型数据
503浏览 • 1回复 待解决
hvigor自定义扩展demo
306浏览 • 1回复 待解决
如何自定义Component 属性
13364浏览 • 3回复 待解决
如何访问自定义文件?
320浏览 • 1回复 待解决
是否支持自定义装饰器
673浏览 • 1回复 待解决
如何自定义组件原型菜单
404浏览 • 1回复 待解决
ArkTs如何自定义容器组件?
1547浏览 • 1回复 待解决
如何自定义模拟Tabs组件
371浏览 • 1回复 待解决
自定义弹窗使用相关问题
362浏览 • 1回复 待解决
自定义弹窗如何嵌套使用
433浏览 • 1回复 待解决
Code Linter自定义代码规范
468浏览 • 1回复 待解决
自定义组件嵌套子组件
7854浏览 • 3回复 待解决