把ts类传到c++层,然后可选择性的运行对应类的方法

把ts类传到c++层,然后可选择性的运行对应类的方法

HarmonyOS
2024-05-23 21:53:04
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
走在河边捡到鱼

本文主要介绍如何实现把ts类传到c++层,然后可选择性的运行对应类的方法

开发者可以使用napi_coerce_to_object将给定的js value强转为js object

然后使用napi_get_named_property,获取给定object中指定名称的属性

使用的核心API

napi_coerce_to_objec

napi_get_named_property

核心代码解释

首先在TS中创建一个export的类

//创建类及方法 
export class DataModel { 
​ 
add(a:number , b:number): number { 
  return a+b; 
} 
sub(a:number , b:number): number { 
  return a-b; 
} 
mul(a:number,b:number):number{ 
  return a*b; 
} 
div(a:number,b:number):number{ 
  return a/b; 
} 
} 
export default new DataModel();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

在.CPP中调用类及方法

// entry\src\main\cpp\hello.cpp 
// 引入N-API相关头文件。 
#include "napi/native_api.h" 
#include <stdio.h> 
#ifndef NativeTest_log_H 
#define NativeTest_log_H 
// TODO:指定domain 
#define LOG_DOMAIN 0x11fff 
// TODO: 指定TAG 
#define LOG_TAG "Hello" 
#include "hilog/log.h" 
​ 
#endif // NativeTest_log_H 
​ 
​ 
// 开发者提供的native方法,入参有且仅有如下两个,开发者不需进行变更。 
// napi_env 为当前运行的上下文。 
// napi_callback_info 记录了一些信息,包括从ArkTS侧传递过来参数等。 
static napi_value Testcal(napi_env env, napi_callback_info info) { 
  napi_value result; 
  // 期望从ArkTS侧获取的参数的数量,napi_value可理解为ArkTS value在native方法中的表现形式。 
  size_t argc = 4; 
  napi_value args[4] = {nullptr}; 
​ 
  // 从info中,拿到从ArkTS侧传递过来的参数,此处获取了一个ArkTS参数,即arg[0]。 
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
​ 
  //从arg[0]中获取ts侧传递的方法 
  double value0; 
  napi_get_value_double(env, args[0], &value0); 
​ 
  double value1; 
  napi_get_value_double(env, args[1], &value1); 
​ 
  // 创建参数数组 
  napi_value arr[2]; 
  napi_create_int32(env, value0, &arr[0]); 
  napi_create_int32(env, value1, &arr[1]); 
  // 从arg[0]中获取ts侧传递的对象 
  napi_value DataModel; 
  napi_create_object(env, &DataModel); 
  napi_coerce_to_object(env, args[2], &DataModel); 
    
  int value2; 
  napi_get_value_int32(env, args[3], &value2); 
​ 
  //获取l类中的方法 
  napi_value add, sub,mul,div; 
  napi_get_named_property(env, DataModel, "add", &add); // 获取方法1 
  napi_get_named_property(env, DataModel, "sub", &sub); // 获取方法2 
  napi_get_named_property(env, DataModel, "mul", &mul); // 获取方法2 
  napi_get_named_property(env, DataModel, "div", &div); // 获取方法2 
  switch (value2) { 
  case 1:{ 
      napi_call_function(env, nullptr, add, 2, arr, &result);break; 
  } 
  case 2: { 
      napi_call_function(env, nullptr, sub, 2, arr, &result);break; 
  } 
  case 3: { 
      napi_call_function(env, nullptr, mul, 2, arr, &result);break; 
  } 
  case 4: { 
      napi_call_function(env, nullptr, div, 2, arr, &result);break; 
  } 
  } 
    
  return result; 
} 
​ 
EXTERN_C_START 
// Init将在exports上挂上Add/NativeCallArkTS这些native方法,此处的exports就是开发者import之后获取到的ArkTS对象。 
static napi_value Init(napi_env env, napi_value exports) { 
​ 
  napi_property_descriptor desc[] = { 
      {"Testcal", nullptr, Testcal, nullptr, nullptr, nullptr, napi_default, nullptr}, 
  }; 
  // 在exports这个ArkTS对象上,挂载native方法。 
  napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
  return exports; 
} 
EXTERN_C_END 
​ 
// 准备模块加载相关信息,将上述Init函数与本模块名等信息记录下来。 
static napi_module demoModule = { 
  .nm_version = 1, 
  .nm_flags = 0, 
  .nm_filename = nullptr, 
  .nm_register_func = Init, 
  .nm_modname = "entry", 
  .nm_priv = ((void *)0), 
  .reserved = {0}, 
}; 
​ 
// 打开so时,该函数将自动被调用,使用上述demoModule模块信息,进行模块注册相关动作。 
extern "C" __attribute__((constructor)) void RegisterHelloModule(void) { napi_module_register(&demoModule); }
  • 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.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.

.est代码

Button('+ ') 
            .fontSize(50) 
            .fontWeight(FontWeight.Bold) 
            .onClick(() => { 
              this.num3=Testcal(this.num1,this.num2,DataModel,1) 
              console.log("testTag",Testcal(this.num1,this.num2,DataModel,1)) 
            }) 
            .margin(20)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

实现效果

适配的版本信息

 IDE:DevEco Studio 4.0.1.601

SDK:HarmoneyOS 4.0.10.11

分享
微博
QQ
微信
回复
2024-05-24 21:31:40
相关问题
tsc++传递数组,c++如何解析
2746浏览 • 1回复 待解决
ArkTS调用C++成员函数
2276浏览 • 1回复 待解决
Har如何导出ts方法
839浏览 • 1回复 待解决
c++中实例化自定义并调用方法
990浏览 • 1回复 待解决
HarmonyOS TS方法重载不能正常使用
991浏览 • 1回复 待解决
c++侧可以直接调用tsstatic方法吗?
3144浏览 • 1回复 待解决
ArkTs 有运行时创建指定方法吗?
1215浏览 • 1回复 待解决