HarmonyOS C++调TS函数的时候怎么传byte数组参数过去

这是我现在的方式:现在能正确的调用,但是无法ts侧无法使用传过来的数组,提示为数组长度为undefined

ts侧:

function sendData(uiContext: UIContext, data: Uint8Array): void {

  // TODO:知识点:使用对应UIAbility的UIContext.runScopedTask来执行方法,确保多实例情况下,事件在正确的窗口/UIAbility内发生
  uiContext.runScopedTask(() => {
    bleManager.sendData(data)
  })
}

c++侧:

void EtsWrapper::TSFn::CallJSSendData(napi_env env, napi_value jscb, void *context, void *data) {

  napi_status status;
  DataPackage *param = (DataPackage *)data;
  uint16_t length = param->length;
  const char *dataToSend = param->data;

  char *dataPtr = nullptr;
  napi_value dataCovered = nullptr;
  napi_create_buffer(g_uniContext->pickerEnv, length, reinterpret_cast<void **>(&dataPtr), &dataCovered);


  napi_create_buffer_copy(g_uniContext->pickerEnv, length, dataToSend, reinterpret_cast<void **>(&dataPtr),
    &dataCovered);

  auto it = g_uniContext->uiContextMap.find(g_uniContext->topAbilityID);
  if (it == g_uniContext->uiContextMap.end()) {
    OH_LOG_ERROR(LOG_APP, "key error: %{public}s", g_uniContext->topAbilityID.c_str());
    delete param;
    return;
  }

  napi_value uiContext = FNS::ParseNapiRef(env, it->second);
  napi_value argv[] = {uiContext, dataCovered};
  status = napi_call_function(env, nullptr, jscb, 2, argv, nullptr);
  if (status != napi_ok) {
    OH_LOG_ERROR(LOG_APP, "call select failed");
  }
  delete param;
  { // NOTE:仅用于用返回值的场景,当jscb有返回值时,上面napi_call_function之后,即可获得其返回值,然后可将其返回值设置到全局
    // 并notify等待返回值的线程
    std::lock_guard<std::mutex> guard(g_uniContext->resultWaitUtil.lock);
    g_uniContext->resultWaitUtil.isFinished = true;
    g_uniContext->resultWaitUtil.cv.notify_all();
  }
}
HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

建议使用napi_create_arraybuffer,可以参考:

static napi_value Multiply(napi_env env, napi_callback_info info) {
  size_t argc = 2;
  napi_value args[2];
  napi_get_cb_info(env, info, &argc, args, NULL, NULL);
  napi_value input_array = args[0];

  double multiplier;
  napi_get_value_double(env, args[1], &multiplier);

  napi_typedarray_type type;
  napi_value input_buffer;
  size_t byte_offset;
  size_t i, length;
  napi_get_typedarray_info(env, input_array, &type, &length, NULL, &input_buffer, &byte_offset);

  void *data;
  size_t byte_length;
  napi_get_arraybuffer_info(env, input_buffer, &data, &byte_length);
  napi_value output_buffer;
  void *output_ptr = NULL;
  napi_create_arraybuffer(env, byte_length, &output_ptr, &output_buffer);

  napi_value output_array;
  napi_create_typedarray(env, type, length, output_buffer, byte_offset, &output_array);

  if (type == napi_uint8_array) {
    uint8_t *input_bytes = (uint8_t *)(data) + byte_offset;
    uint8_t *output_bytes = (uint8_t *)(output_ptr);
    for (i = 0; i < length; i++) {
      OH_LOG_INFO(LOG_APP, "Multiply_for_arraybuffer input_bytes %{public}d", input_bytes[i]);
      output_bytes[i] = (uint8_t)(input_bytes[i] * multiplier);
      OH_LOG_INFO(LOG_APP, "Multiply_for_arraybuffer output_bytes %{public}d", input_bytes[i]);
    }
  } else if (type == napi_float64_array) {
    double *input_doubles = (double *)((uint8_t *)(data) + byte_offset);
    double *output_doubles = (double *)(output_ptr);
    for (i = 0; i < length; i++) {
      output_doubles[i] = input_doubles[i] * multiplier;
    }
  } else {
    napi_throw_error(env, NULL, "Typed array was of a type not expected by test.");
    return NULL;
  }
  return output_array;
}
分享
微博
QQ
微信
回复
1天前
相关问题
tsc++传递数组c++层如何解析
1948浏览 • 1回复 待解决
如何为 C++ 提供回函数
2476浏览 • 1回复 待解决
C++时,如何阻塞TS主线程?
528浏览 • 1回复 待解决
如何实现ArkTS与C/C++数组转换
784浏览 • 1回复 待解决
HarmonyOS C++函数插桩功能
39浏览 • 1回复 待解决
ArkTS调用C++类中成员函数
1347浏览 • 1回复 待解决
如何将jsmap转成c++对象
759浏览 • 1回复 待解决
HarmonyOS 项目使用c++库导出函数报错
336浏览 • 1回复 待解决
c++侧可以直接调用tsstatic方法吗?
2191浏览 • 1回复 待解决
HarmonyOS 本地文件如何转为byte数组
30浏览 • 1回复 待解决
ArkTS如何把string转为byte数组
3057浏览 • 1回复 待解决
提问
该提问已有0人参与 ,帮助了0人