在编写NAPI时,如果想要返回一个C对象,该如何处理?我看没有类似的示例可参考?

在编写NAPI时,比如下面的方法:

std::shared_ptr<FaceActionEstimation> faceActionEstimation_; 
 
static napi_value SetUpPredictorTest(napi_env env, napi_callback_info info) { 
  if ((nullptr == env) || (nullptr == info)) { 
    OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "JKSetUpPredictor", "env or exports is null"); 
    return nullptr; 
  } 
  // 参数个数 
  size_t argc = 1; 
  // 声明参数数组 
  napi_value args[1] = {nullptr}; 
 
  // 获取传入的参数并将其放入参数数组中 
  if (napi_ok != napi_get_cb_info(env, info, &argc, args, nullptr, nullptr)) { 
    OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "JKSetUpPredictor", "napi_get_cb_info failed"); 
    return nullptr; 
  } 
  // 将传入的参数转换类型 
  char *faceDetectModelDirChar; 
  size_t length; 
  if (napi_ok != napi_get_value_string_utf8(env, args[0], faceDetectModelDirChar, 0, &length)) { 
    OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "JKSetUpPredictor", "napi_get_value_string_utf8 failed"); 
    return nullptr; 
  } 
  // 将char*转为std::string类型 
  std::string faceDetectModelDir = faceDetectModelDirChar; 
 
  faceActionEstimation_.reset(new FaceActionEstimation(faceDetectModelDir)); 
 
  return faceActionEstimation_; 
} 
 
 
class FaceActionEstimation { 
  public: 
    FaceActionEstimation(const std::string &fdtModelDir); 
  ~FaceActionEstimation() = default; 
  std::array<float, 7> process(const cv::Mat &image, int stage, int action_type); 
  )

在HarmonyOS的NDK中,我不知道如何返回这个实例,返回以后又该在arkTS端如何接收?接收以后如何进行下一步调用它的process处理方法?

HarmonyOS
2024-11-04 09:17:37
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

​在NDK中向ArkTS返回C++对象并调用对应的方法可以参考如下文档:​https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/napi/use-napi-object-wrap.md

C++直接调用process方法,只将结果返回给 arkTs 使用,可以使用如下方式:​

// napi_init.cpp 注册实现 ArkTS 的函数,并 
static napi_value Process(napi_env env, napi_callback_info info) { 
  size_t requireArgc = 2; 
  size_t argc = 2; 
  napi_value args[2] = {nullptr}; 
 
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
 
  napi_valuetype valuetype0; 
  napi_typeof(env, args[0], &valuetype0); 
 
  napi_valuetype valuetype1; 
  napi_typeof(env, args[1], &valuetype1); 
 
  int stage; 
  napi_get_value_int32(env, args[0], &stage); 
 
  int action_type; 
  napi_get_value_int32(env, args[1], &action_type); 
 
  // 获取 process 函数的结果 
  FaceActionEstimation fae; 
  std::array<float, 7> tmp = fae.process(stage, action_type); 
  // 创建 array 对象 
  napi_value result; 
  napi_create_array(env, &result); 
  // 设置 array 元素的值 
  for (int i = 0; i < tmp.size(); i++) { 
    napi_value cur; 
    napi_create_double(env, tmp[i], &cur); 
    napi_set_element(env, result, i, cur); 
  } 
  return result; 
} 
 
 
napi_property_descriptor desc[] = { 
  { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }, 
{ "process", nullptr, Process, nullptr, nullptr, nullptr, napi_default, nullptr } 
}; 
 
// index.d.ts 
export const process: (stage: number, action_type: number) => number[]; 
 
// index.ets 调用 
import testNapi from 'libentry.so'; 
Button() 
  .onClick(() => { 
    this.message = testNapi.process(1, 2).toString() 
  })

​Node-API支持的数据类型和接口可以参考:​https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/napi-data-types-interfaces-V5

分享
微博
QQ
微信
回复
2024-11-04 17:17:01
相关问题
如何编写一个可继承的Page?
349浏览 • 1回复 待解决
编写一个页面,实现吸顶效果
1135浏览 • 1回复 待解决
编写一个页面,实现不规则列表
781浏览 • 1回复 待解决
HarmonyOS 如何返回一个颜色?
283浏览 • 1回复 待解决
蓝牙连接报错如何处理
434浏览 • 1回复 待解决
JS如开发一个横向拖动的表格
6358浏览 • 1回复 待解决
想要实现一个图片裁剪的功能
374浏览 • 1回复 待解决