ArkTS与C++互相直接调用

ArkTS与C++互相直接调用

HarmonyOS
2024-05-28 21:41:57
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
firecc

ArkTS 调用 C++

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; 
}

将add接口导出

EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
    napi_property_descriptor desc[] = { 
        {"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr} 
    }; 
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
    return exports; 
}

在index.d.ts中链接C++侧函数与ArkTS侧函数:

export const add: (a: number, b: number) => number;

在ArkTS中调用函数:

import hilog from '@ohos.hilog'; 
import nativeFun from 'libentry.so'; 
​ 
@Entry 
@Component 
struct Index { 
  build() { 
    Row() { 
      Column() { 
        Button("JS Call C++") 
          .onClick(() => { 
            hilog.info(0x0000, 'testTag', 'JS Call C++ 2 + 3 = %{public}d', nativeFun.add(2, 3)); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}

C++侧调用ArkTS侧函数:

1. 直接将ArkTS侧函数传过来:

在index.d.ts中链接ArkTS侧函数与C++侧函数:

export const nativeCallArkTS: (cb: (a: string) => string) => string;

在C++测调用ArkTS侧函数:

static napi_value NativeCallArkTS(napi_env env, napi_callback_info info) { 
    size_t argc = 1; 
    // 声明参数数组 
    napi_value args[1] = {nullptr}; 
​ 
    // 获取传入的参数并依次放入参数数组中 
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
​ 
    // 创建一个string,作为ArkTS的入参 
    napi_value argv = nullptr; 
    napi_create_string_utf8(env, "yes", 3, &argv); 
     
​ 
    // 调用传入的callback,并将其结果返回 
    napi_value result = nullptr; 
    napi_call_function(env, nullptr, args[0], 1, &argv, &result); 
    return result; 
}

将NativeCallArkTS接口导出:

EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
    napi_property_descriptor desc[] = { 
        {"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr} 
    }; 
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
    return exports; 
}

在ArkTS中调用函数:

import nativeFun from 'libentry.so'; 
​ 
@Entry 
@Component 
struct Index { 
  @State message: string = ''; 
​ 
  build() { 
    Row() { 
      Column() { 
        Text(this.message) 
          .onClick(() => { 
            this.message += nativeFun.nativeCallArkTS((a: string)=> { 
              return a }) 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}

2. ArkTS中的函数封装在object中:

export class Add{ 
  add(a:number, b:number):number{ 
    return a + b; 
  } 
}

在index.d.ts中链接C++侧函数与ArkTS侧函数:

export const NativeCallArkTS: (obj:Object, a: number, b: number) => number;

在C++测调用ArkTS侧函数:

// 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; 
}

与上面直接直接传函数的区别在于:直接传函数作为入参可以直接在C++侧调用 napi_call_function()来执行,传object封装后的函数需要先调用napi_get_named_property()将object中的函数解析出来。

将NativeCallArkTS接口导出:

EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
    napi_property_descriptor desc[] = { 
        { "NativeCallArkTS", nullptr, NativeCallArkTS, nullptr, nullptr, nullptr, napi_default, nullptr } 
    }; 
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
    return exports; 
}

在ArkTS中调用函数:

import hilog from '@ohos.hilog'; 
import testNapi from 'libentry.so'; 
export class Add{ 
  add(a:number, b:number):number{ 
    return a + b; 
  } 
} 
@Entry 
@Component 
struct Index { 
  build() { 
    Row() { 
      Column() { 
        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)); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}
分享
微博
QQ
微信
回复
2024-05-29 23:00:34
相关问题
如何实现ArkTSC/C++的HashMap转换?
434浏览 • 0回复 待解决
C++调用ArkTS 定义的方法
604浏览 • 1回复 待解决
c++侧可以直接调用ts的static方法吗?
716浏览 • 1回复 待解决
ArkTS调用C++类中的成员函数
542浏览 • 1回复 待解决
arkTs能和arkjs互相调用吗?
1020浏览 • 1回复 待解决
C++中的native方法能否直接导出
764浏览 • 1回复 待解决
如何在C/C++ 创建ArkTS的对象
851浏览 • 1回复 待解决
C++ 如何获取操作 Arkts 实例
425浏览 • 1回复 待解决
ArkTSC++之间的交互
440浏览 • 1回复 待解决
C++同步调ArkTS里面的方法
456浏览 • 1回复 待解决
arkts能否直接调用nodejs的接口
631浏览 • 1回复 待解决
通过Native 调用c++层实现文本绘制
472浏览 • 1回复 待解决
ArkTS对象绑定的C++对象如何回收?
391浏览 • 1回复 待解决
如何修改C++版本?C++支持情况?
349浏览 • 1回复 待解决