把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();

在.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); }

.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)

实现效果

适配的版本信息

 IDE:DevEco Studio 4.0.1.601

SDK:HarmoneyOS 4.0.10.11

分享
微博
QQ
微信
回复
2024-05-24 21:31:40
相关问题
ArkTS调用C++成员函数
1190浏览 • 1回复 待解决
tsc++传递数组,c++如何解析
1747浏览 • 1回复 待解决
Har如何导出ts方法
326浏览 • 1回复 待解决
c++中实例化自定义并调用方法
238浏览 • 1回复 待解决
c++侧可以直接调用tsstatic方法吗?
1939浏览 • 1回复 待解决
ArkTs 有运行时创建指定方法吗?
134浏览 • 1回复 待解决
安卓Transformation对应鸿蒙哪个?
4155浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
266浏览 • 1回复 待解决
HarmonyOS ArkTS支持TS抽象吗?
144浏览 • 1回复 待解决
日志工具使用方法
306浏览 • 1回复 待解决