HarmonyOS C/C++库开发 C侧和TS之间的数据交互

问题:

1. ts 傳 struct 給 napi 標準的做法,是否有sample code?

2. ts 傳 pointer 給 napi 標準的做法,是否有sample code?场景:C++ 工程Native和上层ArkTS复杂的数据传递 (或者说Native的对象数据与ArkTS的对象数据如何绑定?)实现:尝试过程中能够实现数据交换,但是同一份数据其数据类型会多次转换拷贝,影响性能。

以下是基于自己的API的开发Native C++ project遇到的具体例子:

C API:

INT32 PPCS_NetworkDetect(st_PPCS_NetInfo *NetInfo, UINT16 UDP_Port); 
struct st_PPCS_NetInfo: 
typedef struct{ 
  char bFlagInternet; 
  char bFlagHostResolved; 
  char bFlagServerHello; 
  char NAT_Type; 
  char MyLanIP[16]; 
  char MyWanIP[16]; 
} st_PPCS_NetInfo;

希望在底层调用PPCS_NetworkDetect()返回填充的struct st_PPCS_NetInfo能够高效的在上层Arkts使用或呈现,而不是需要我们去经过复杂的数据类型转换,是否有方案就是能够提供pointer让两层的数据对象直接高效交互。

HarmonyOS
2024-09-12 13:39:34
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
FengTianYa

因为涉及跨语言调用,所以类型转换几乎是必须的。【建议】 尽可能的减少数据转换次数,避免不必要的复制。减少数据转换次数: 频繁的数据转换可能会导致性能下降,可以通过批量处理数据或者使用更高效的数据结构来优化性能;避免不必要的数据复制: 在进行数据转换时,可以使用Node-API提供的接口来直接访问原始数据,而不是创建新的副本;使用缓存: 如果某些数据在多次转换中都会被使用到,可以考虑使用缓存来避免重复的数据转换。缓存可以减少不必要的计算,提高性能。可以使用高性能数组存储值类型数据,使用ArrayBuffer代替JSArray来提高应用性能。参考链接:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/napi-guidelines-V5#%E9%AB%98%E6%80%A7%E8%83%BD%E6%95%B0%E7%BB%84

https://gitee.com/openharmony/arkui_napi/blob/master/sample/native_module_systemtest/js_test_arraybuffer.cpp

问题1:可以通过如下代码传一个ts的类到c侧并通过napi_get_named_property获取类中的成员://在ArkTS中声明两个类,在tsClass中有三个成员函数,分别会需要string,number和testCb类作为入参。

export class testCb{ 
  testNum:number = 0; 
  testString:string = 'hello world'; 
}; 
export class tsClass { 
  public onCallBack1(id: string){ 
    //操作id 
    console.log("testcallback1" + id) 
  } 
  public onCallBack2(cnt: number){ 
    // 操作number 
    console.log("testcallback2" + cnt) 
  } 
  public onCallBack3(cbClass: testCb){ 
    // 操作cbClass 
    console.log("testcallback3" + cbClass.testNum) 
  } 
} 
//在index.d.ts中链接C++侧函数与ArkTS侧函数: 
export const changeClass: (a: Object) => void; 
export const transObject: (a: Object) => void; 
//cpp中的实现: 
static napi_value TransObject(napi_env env, napi_callback_info info) { 
  napi_status status; 
  size_t argc = 1; 
  napi_value js_cb; 
  // 获取TS侧传入的参数 
  status = napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr); 
  // 获取TS 对象的方法 onCallBack1 
  napi_value onCallBack1, str_arg; 
  status = napi_get_named_property(env, js_cb, "onCallBack1", &onCallBack1); 
  status = napi_create_string_utf8(env, "mangguo", strlen("mangguo"), &str_arg); 
  // 调用TS 对象的方法 onCallBack1 
  size_t cb1argc = 1; 
  status = napi_call_function(env, js_cb, onCallBack1, cb1argc, &str_arg, nullptr); 
  // 获取TS 对象的方法 onCallBack2 
  size_t cb2argc = 1; 
  napi_value onCallBack2, int_arg; 
  status = napi_get_named_property(env, js_cb, "onCallBack2", &onCallBack2); 
  status = napi_create_int32(env, 2, &int_arg); 
  // 调用TS 对象的方法 onCallBack2 
  status = napi_call_function(env, js_cb, onCallBack2, cb2argc, &int_arg, nullptr); 
  // 获取TS 对象的方法 onCallBack3 
  napi_value oncallback3, arg_object; 
  status = napi_get_named_property(env, js_cb, "onCallBack3", &oncallback3); 
  // native 层创建对象arg_object 
  status = napi_create_object(env, &arg_object); 
  napi_value testNum,testString,cb3argc; 
  status = napi_create_int32(env, 123, &testNum); 
  // 给上面创建的arg_object对象属性testNum赋值123 
  status = napi_set_named_property(env, arg_object, "testNum", testNum); 
  status = napi_create_string_utf8(env, "mangguo", strlen("mangguo"), &testString); 
  // 给上面创建的arg_object对象属性testString赋值mangguo 
  status = napi_set_named_property(env, arg_object, "testString", testString); 
  // 调用TS 对象的方法 onCallBack3,并将上面创建的对象arg_object,作为方法参数传递 
  status = napi_call_function(env, js_cb, oncallback3, cb2argc, &arg_object, nullptr); 
  return nullptr; 
} 
static napi_value ChangeClass(napi_env env, napi_callback_info info) { 
  napi_status status; 
  size_t argc = 1; 
  napi_value arg_object; 
  // 获取TS侧传入的参数 
  status = napi_get_cb_info(env, info, &argc, &arg_object, nullptr, nullptr); 
  napi_value testNum, testString; 
  status = napi_get_named_property(env, arg_object, "testNum", &testNum); 
  status = napi_get_named_property(env, arg_object, "testString", &testString); 
  double value0; 
  napi_get_value_double(env, testNum, &value0); 
  OH_LOG_Print(LOG_APP, LOG_INFO, 0,"test", "test num before changing= %{public}f",value0); 
  status = napi_create_int32(env, 123, &testNum); 
  // 给上面创建的arg_object对象属性testNum赋值123 
  sleep(5000); 
  status = napi_set_named_property(env, arg_object, "testNum", testNum); 
  status = napi_create_string_utf8(env, "mangguo", strlen("mangguo"), &testString); 
  status = napi_set_named_property(env, arg_object, "testString", testString); 
  napi_value testNum2, testString2; 
  status = napi_get_named_property(env, arg_object, "testNum", &testNum2); 
  napi_get_value_double(env, testNum2, &value0); 
  OH_LOG_Print(LOG_APP, LOG_INFO, 0, "test", "test num after changing= %{public}f", value0); 
  return nullptr; 
} 
//在ArkTS中调用 
TsOBJ:tsClass = new tsClass(); 
TsOBJ2:testCb = new testCb(); 
testNapi.transObject(this.TsOBJ) 
testNapi.changeClass(this.TsOBJ2)

问题2:不支持。

分享
微博
QQ
微信
回复
2024-09-12 16:58:16
相关问题
ArkTSC++之间交互
1140浏览 • 1回复 待解决
HarmonyOS ArkTS与C/C++交互
431浏览 • 1回复 待解决
c++可以直接调用tsstatic方法吗?
1881浏览 • 1回复 待解决
tsc++传递数组,c++层如何解析
1695浏览 • 1回复 待解决
AVPlayer实现音频播放(c++
1061浏览 • 1回复 待解决
怎样用c\c++开发啊有知道吗?
4032浏览 • 1回复 待解决
HarmonyOS应用开发 支持C++吗?
17588浏览 • 1回复 待解决
HarmonyOS 如何调用标准C++
278浏览 • 1回复 待解决
使用C++进行HarmonyOS开发问题
398浏览 • 2回复 待解决
dev studio可以用C#或者C++开发吗?
3514浏览 • 1回复 待解决
如何修改C++版本?C++支持情况?
842浏览 • 1回复 待解决
HarmonyOS应用开发 没有 C++ UI 框架
14170浏览 • 2回复 待解决
HarmonyOS C++使用aki,编译报错
189浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS对象
2038浏览 • 1回复 待解决
如何实现ArkTS与C/C++HashMap转换?
943浏览 • 0回复 待解决
HarmonyOS C++异步操作
205浏览 • 1回复 待解决
c/c++层主动调用ArkTS存在问题
230浏览 • 1回复 待解决
如何实现ArkTS与C/C++数组转换
477浏览 • 1回复 待解决