HarmonyOS鸿蒙Next中C++调TS函数的时候怎么传byte数组参数过去?

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS鸿蒙Next中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: %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鸿蒙Next中C++调TS函数的时候怎么传byte数组参数过去?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,C++调用TS函数时传递byte数组参数,可以通过以下步骤实现:

  1. 定义TS函数接口:在TS层定义一个接收byte数组的函数,确保函数签名正确。

    function receiveByteArray(data: Uint8Array): void {
        // 处理byte数组
    }
  2. 使用NAPI绑定:在C++层使用NAPI(Node-API)将byte数组传递给TS函数。首先,创建一个napi_value类型的数组,然后将byte数据填充到该数组中。

    #include <napi.h>
    
    void CallTsFunctionWithByteArray(Napi::Env env, Napi::Function tsFunction) {
        uint8_t byteArray[] = {0x01, 0x02, 0x03, 0x04};
        size_t length = sizeof(byteArray) / sizeof(byteArray[0]);
    
        Napi::Uint8Array array = Napi::Uint8Array::New(env, length);
        for (size_t i = 0; i < length; ++i) {
            array[i] = byteArray[i];
        }
    
        tsFunction.Call({array});
    }
  3. 调用TS函数:在C++中调用TS函数时,将Napi::Uint8Array作为参数传递。

    Napi::Function tsFunction = /* 获取TS函数 */;
    CallTsFunctionWithByteArray(env, tsFunction);

通过上述步骤,C++层可以将byte数组传递给TS函数进行处理。确保在TS层正确处理Uint8Array类型的数据。

更多关于HarmonyOS鸿蒙Next中C++调TS函数的时候怎么传byte数组参数过去?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,C++调用TS函数时传递byte数组参数,可以通过napi接口实现。首先,将C++的byte数组转换为napi_value类型,然后通过napi_call_function调用TS函数。具体步骤如下:

  1. 使用napi_create_arraybuffer创建ArrayBuffer
  2. 将C++ byte数组数据拷贝到ArrayBuffer中。
  3. 使用napi_create_typedarray创建Uint8Array
  4. 调用TS函数,将Uint8Array作为参数传递。

示例代码片段:

napi_value array_buffer;
napi_create_arraybuffer(env, byteArraySize, &data, &array_buffer);

napi_value typed_array;
napi_create_typedarray(env, napi_uint8_array, byteArraySize, array_buffer, 0, &typed_array);

napi_value global;
napi_get_global(env, &global);

napi_value ts_function;
napi_get_named_property(env, global, "tsFunctionName", &ts_function);

napi_value result;
napi_call_function(env, global, ts_function, 1, &typed_array, &result);

确保TS函数接收Uint8Array类型参数,并正确处理传入的byte数组数据。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!