TS侧如何批量传递函数到native侧

在native需要调用一系列函数,如果每个方法都通过单独的参数传递到native侧的话,会比较繁琐。此时可以将函数包装在一个对象或者数组中,通过传递对象或数组达成传递一系列函数的目的。本文通过在数组中传递两个匿名函数及一个对象的方式完成TS侧批量传递函数到native侧的目的。

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

使用的核心API

napi_get_element

napi_get_named_property

napi_call_function

napi相关api使用可参考:https://nodejs.org/api/n-api.html

nodejs在HarmonyOS的支持情况可参考:https://gitee.com/openharmony/arkui_napi/blob/master/libnapi.ndk.json

核心代码解释

.cpp

static napi_value Test(napi_env env, napi_callback_info info) { 
    // 期望从ArkTS侧获取的参数的数量,napi_value可理解为ArkTS value在native方法中的表现形式。 
    size_t argc = 1; 
    napi_value args[1] = {nullptr}; 
  
    // 从info中,拿到从ArkTS侧传递过来的参数,此处获取了一个ArkTS参数,即arg[0]。 
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  
    //从arg[0]中获取ts侧传递的方法 
    napi_value mul = nullptr; 
    napi_get_element(env, args[0], 0, &mul); 
  
    napi_value div = nullptr; 
    napi_get_element( env, args[0], 1, &div); 
     
    // 从arg[0]中获取ts侧传递的对象 
    napi_value DataModel = nullptr; 
    napi_get_element(env, args[0], 2, &DataModel); 
     
    //获取对象中的方法 
    napi_value add, sub; 
    napi_get_named_property(env, DataModel, "add", &add); // 获取方法1 
    napi_get_named_property(env, DataModel, "sub", &sub); // 获取方法2 
    
    // 创建参数数组 
    napi_value arr[2]; 
    napi_create_int32(env, 10, &arr[0]); 
    napi_create_int32(env, 5, &arr[1]); 
  
    // 创建一个ArkTS number作为ArkTS function的入参。 
    napi_value argv = nullptr; 
    napi_create_int32(env, 2, &argv); 
     
    // 调用方法add 
    napi_value result1; 
    napi_call_function(env, nullptr, add, 2, arr, &result1); 
  
    // 调用方法sub 
    napi_value result2; 
    napi_call_function(env, nullptr, sub, 2, arr, &result2); 
     
    napi_value result3; 
    napi_call_function(env, nullptr, mul, 1, &argv, &result3); 
     
    napi_value result4; 
    napi_call_function(env, nullptr, div, 1, &argv, &result4); 
  
    return result1; 
}

index.ets

// entry\src\main\ets\pages\index.ets 
  
import hilog from '@ohos.hilog'; 
// 通过import的方式,引入native能力。 
import entry from 'libentry.so' 
import { DataModel }from '../viewmodel/DataModel'; 
import Test from '../viewmodel/Test'; 
  
@Entry 
@Component 
struct Index { 
  build() { 
    Row() { 
      Column() { 
        Button('Arr Test ArkTS ') 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            let arr:Object[]=[]; 
            arr[0]=(value)=>{return value * 2;} 
            arr[1]=(value)=>{return value / 2;} 
            arr[2]=DataModel; 
              hilog.isLoggable(0x0000, 'testTag', hilog.LogLevel.INFO); 
              let ret = entry.test(arr); 
              hilog.info(0x0000, 'testTag', 'Test NAPI test ret = %{public}d', ret); 
  
          }) 
          .margin(20) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
} 

DataModel.ets

export class DataModel { 
  /** 
   * Saved Data. 
   */ 
  
  /** 
   * Get the data. 
   */ 
  static add(a:number , b:number): number { 
    return a+b; 
  } 
  static sub(a:number , b:number): number { 
    return a-b; 
  } 
} 

上述代码中,index.ets文件中创建一个arr数组,存放两个匿名函数及一个DateModel对象(DateModel中存在两个方法)。将数组传入到c++侧后,通过napi_get_element 方法分别获得数组中的两个匿名函数及DateModel对象。在通过napi_get_named_property方法获取DateModel对象中的方法,最后通过napi_call_function方法分别调用获得的方法,经测试上述方法均可成功调用。

注:napi_call_function函数可以传递多个参数,上述代码中分别尝试了传入一个和两个参数的情况。

实现效果

c++侧能正常获取并调用arkts侧传递的方法

适配的版本信息

·IDE:DevEco Studio 4.1.1.300

·SDK:HarmoneyOS 4.0.0.42

分享
微博
QQ
微信
回复
2024-05-24 21:14:50
相关问题
Native调用ArkTS函数
320浏览 • 1回复 待解决
arktshashmap转为native
389浏览 • 1回复 待解决
Native如何打印char指针
592浏览 • 1回复 待解决
ArkTSNative如何进行map数据交互
762浏览 • 1回复 待解决
native如何调用类的静态方法?
578浏览 • 1回复 待解决
native的log获取不到
485浏览 • 1回复 待解决
如何Native释放ArkTS对象
783浏览 • 1回复 待解决
native如何使用类的静态方法
449浏览 • 1回复 待解决
如何Native获取APP版本信息
778浏览 • 1回复 待解决
如何Native构建一个ArkTS对象
660浏览 • 1回复 待解决
单框架native文件读取权限问题
354浏览 • 1回复 待解决
Native如何引入头文件deviceinfo.h
645浏览 • 1回复 待解决
Native如何使用hilog打印出日志信息
860浏览 • 1回复 待解决
Native如何获取可操作的文件目录
646浏览 • 1回复 待解决
Native进行跨模块加载
199浏览 • 1回复 待解决
Native创建线程是否有限制
738浏览 • 1回复 待解决