将C++层分配的对象在ArkTS层管理,ArkTS层通过接口访问C++层对象业务

将C++层分配的对象在ArkTS层管理,ArkTS层通过接口访问C++层对象业务

HarmonyOS
2024-05-23 21:30:16
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
人间冰美式

需要在C++侧对TS对象属性进行修改,在TS侧实现接口修改属性,然后通过C++侧NAPI调用。

该场景的实现思路是:C++层分配一个class对象,将该对象的地址返回给ArkTS层,ArkTS层通过自定义的class对象中的一个number属性存储C++层对象返回的地址。后续ArkTS层的对象涉及到对C++层的对象业务处理时,会调用接口将C++层对象的地址传递到C++层处理。

使用的核心API

napi_create_bigint_int64
napi_get_value_bigint_int64
napi_get_cb_info

核心代码解释

C++层将定义的对象返回到ArkTS层:

static napi_value DefineObject(napi_env env, napi_callback_info info) {   
    OH_LOG_INFO(LOG_APP, "enter DefineObject");   
       
    napi_value result;   
    auto a = new TestClass();   
    int64_t addrValue = (int64_t)a;   
    napi_create_bigint_int64(env, addrValue, &result);   
   
    OH_LOG_INFO(LOG_APP, "end DefineObject, addrValue:%{public}ld", addrValue);   
   
    return result;   
}

C++层接收ArkTS层传递过来的对象地址作业务:

static napi_value CallObject(napi_env env, napi_callback_info info) {   
    OH_LOG_INFO(LOG_APP, "enter CallObject");   
    size_t requireArgc = 2;   
    size_t argc = 1;   
    napi_value args[1] = {nullptr};   
   
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);   
   
    int64_t addrValue = 0;   
    bool flag = false;   
    napi_get_value_bigint_int64(env, args[0], &addrValue, &flag);   
   
    TestClass *a = (TestClass *)addrValue;   
   
    OH_LOG_INFO(LOG_APP, "CallObject, addrValue:%{public}ld", addrValue);   
   
    OH_LOG_INFO(LOG_APP, "CallObject, value:%{public}d", a->GetValue());   
    a->SetValue(888);   
   
    return nullptr;   
}

实现效果

手机上执行结果如下:

适配的版本信息

IDE:DevEco Studio NEXT Developer Preview1 4.1.3.500

SDK:HarmoneyOS 4.1.0.57

分享
微博
QQ
微信
回复
2024-05-24 16:11:21
相关问题
ArkTS通过接口访问C++对象
383浏览 • 1回复 待解决
HarmonyOS 从C++触发通知到ArkTS
108浏览 • 1回复 待解决
c/c++主动调用ArkTS存在问题
426浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
1091浏览 • 1回复 待解决
HarmonyOS ETS和c++通信
35浏览 • 1回复 待解决
ts给c++传递数组,c++如何解析
1938浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS对象
2259浏览 • 1回复 待解决
ArkTS对象绑定C++对象如何回收?
948浏览 • 1回复 待解决
ArkTS获取对象所有方法
1630浏览 • 1回复 待解决
HarmonyOS C++自定义组件如何开发?
345浏览 • 1回复 待解决