ArkTS和C++之间的交互

ArkTS和C++之间的交互

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

一、背景

实现ArkTS和C++之间的交互

二、相关接口

napi_get_cb_info从info中,拿到从ArkTS侧传递过来的参数

napi_get_named_property获取对象的属性

napi_call_function调用 JavaScript 函数对象

三、JS调用C++

// JS调用C++ 
static napi_value Add(napi_env env, napi_callback_info info) 
{ 
    // 期望从ArkTS侧获取的参数的数量,napi_value可理解为ArkTS value在native方法中的表现形式。 
    size_t argc = 2; 
    napi_value args[2] = {nullptr}; 
  
    // 从info中,拿到从ArkTS侧传递过来的参数,此处获取了两个ArkTS参数,即arg[0]和arg[1]。 
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  
    // 将获取的ArkTS参数转换为native信息,此处ArkTS侧传入了两个number,这里将其转换为native侧可以操作的double类型。 
    double value0; 
    napi_get_value_double(env, args[0], &value0); 
  
    double value1; 
    napi_get_value_double(env, args[1], &value1); 
  
    // native侧的业务逻辑,这里简单以两数相加为例。 
    double nativeSum = value0 + value1; 
  
    // 此处将native侧业务逻辑处理结果转换为ArkTS值,并返回给ArkTS。 
    napi_value sum; 
    napi_create_double(env, nativeSum, &sum); 
    return sum; 
} 

四、C++调用JS

// C++调用JS 
static napi_value NativeCallArkTS(napi_env env, napi_callback_info info) { 
    // 期望从ArkTS侧获取的参数的数量,napi_value可理解为ArkTS value在native方法中的表现形式。 
    size_t argc = 3; 
    napi_value args[3] = {nullptr}; 
  
    // 从info中,拿到从ArkTS侧传递过来的参数。 
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  
    // 获取对象的方法 
    napi_value add; 
    napi_get_named_property(env, args[0], "add", &add); 
  
    // 获取函数入参 
    double value0; 
    napi_get_value_double(env, args[1], &value0); 
    double value1; 
    napi_get_value_double(env, args[2], &value1); 
  
    // 创建两个个ArkTS number作为ArkTS function的入参。 
    napi_value argv[2] = {nullptr}; 
    napi_create_double(env, value0, &argv[0]); 
    napi_create_double(env, value1, &argv[1]); 
  
    napi_value result = nullptr; 
    // native方法中调用ArkTS function,其返回值保存到result中并返到ArkTS侧。 
    napi_call_function(env, nullptr, add, 2, argv, &result); 
  
    return result; 
} 
 

五、index.ets实现

Button("JS Call C++") 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            hilog.info(0x0000, 'testTag', 'JS Call C++ 2 + 3 = %{public}d', testNapi.add(2, 3)); 
          }) 
        Button("C++ Call JS") 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            hilog.info(0x0000, 'testTag', 'C++ Call JS 2 + 3 = %{public}d', testNapi.NativeCallArkTS(new Add(), 2, 3)); 
          })
分享
微博
QQ
微信
回复
2024-05-24 21:36:34
相关问题
如何在C/C++ 创建ArkTS对象
919浏览 • 1回复 待解决
C++调用ArkTS 定义方法
666浏览 • 1回复 待解决
卡片app之间数据是如何交互
789浏览 • 1回复 待解决
如何实现ArkTSC/C++HashMap转换?
481浏览 • 0回复 待解决
C++ 如何获取操作 Arkts 实例
430浏览 • 1回复 待解决
ArkTS对象绑定C++对象如何回收?
409浏览 • 1回复 待解决
ArkTS调用C++类中成员函数
564浏览 • 1回复 待解决
ArkTSC++互相直接调用
584浏览 • 1回复 待解决
C++同步调ArkTS里面的方法
481浏览 • 1回复 待解决
如何修改C++版本?C++支持情况?
378浏览 • 1回复 待解决
aki是否支持C++虚函数callback?
518浏览 • 1回复 待解决
ts给c++传递数组,c++层如何解析
633浏览 • 1回复 待解决