HarmonyOS鸿蒙Next中C++调TS函数的时候怎么传byte数组参数过去?
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
在HarmonyOS鸿蒙Next中,C++调用TS函数时传递byte数组参数,可以通过以下步骤实现:
-
定义TS函数接口:在TS层定义一个接收byte数组的函数,确保函数签名正确。
function receiveByteArray(data: Uint8Array): void { // 处理byte数组 }
-
使用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}); }
-
调用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函数。具体步骤如下:
- 使用
napi_create_arraybuffer
创建ArrayBuffer
。 - 将C++ byte数组数据拷贝到
ArrayBuffer
中。 - 使用
napi_create_typedarray
创建Uint8Array
。 - 调用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数组数据。