背景
c++層數據都是二進制,需要轉換成arrayBuffer透傳到ets層給業務使用,但是鴻蒙的使用下面兩個api創建出來的二進制數組數據都是錯誤的。
napi_create_arraybuffer: 這個接口只能創建空的二進制數組,沒辦法把char的內容丟進去創建
napi_create_external_arraybuffer: 這個接口支持創建二進制數組時候丟入初始化參數,但是如果你data是非unsigned char。你里面的數據就會轉換錯亂,導致二進制的數據無法再轉換成正確的字符串
代碼實例
錯誤的代碼例子:
//接收ets傳入的string字符串 char type[64] = {0}; size_t eventTypeLen = 0; napi_get_value_string_utf8(env, args[0], type, sizeof(type), &eventTypeLen); //錯誤的二進制數組寫法 napi_value result1 = nullptr; napi_create_external_arraybuffer(env, data, eventTypeLen, [](napi_env env, void *data, void *hint) {}, nullptr, &result1); //這里返回的二進制數組到ets層,是無法正常轉換回字符串的 return result1;
正確的代碼例子:
//接收ets傳入的string字符串 char type[64] = {0}; size_t eventTypeLen = 0; napi_get_value_string_utf8(env, args[0], type, sizeof(type), &eventTypeLen); //正確,把type轉換成無符號的char*,然后作為參數傳入就可以得到正確二進制流 unsigned char *arrayBuffer = new unsigned char[sizeof(type)]; //復制內容 memcpy(arrayBuffer, reinterpret_cast(type), sizeof(type)); napi_create_external_arraybuffer( env, arrayBuffer, eventTypeLen, [](napi_env env, void *data, void *hint) {}, nullptr, &result1); //這里返回的二進制數組到ets層,正常轉換回字符串的 return result1;
創建方案二
1.方案二是創建一個空的arrayBuffer,然后給里面的data進行賦值,但是比較詭異我沒想懂的是,napi_create_arraybuffer 的第三個參數data,并沒有和第四個參數napi_value關聯,但是修改data的值確能應該arrayBuffer的值
//napi_create_arraybuffer的源碼 NAPI_EXTERN napi_status napi_create_arraybuffer(napi_env env, size_t byte_length, void** data, napi_value* result) { NAPI_PREAMBLE(env); CHECK_ARG(env, data); CHECK_ARG(env, result); auto vm = reinterpret_cast(env)->GetEcmaVm(); uint8_t** values = (uint8_t**)(data); Local res = panda::ArrayBufferRef::New(vm, byte_length); if (values != nullptr) { *values = reinterpret_cast(res->GetBuffer()); } *result = JsValueFromLocalValue(res); return GET_RETURN_STATUS(env); }
2.第二種創建方法例子
//接收ets傳入的string字符串 char type[64] = {0}; size_t eventTypeLen = 0; napi_get_value_string_utf8(env, args[0], type, sizeof(type), &eventTypeLen); napi_value result2 = nullptr; void* data = nullptr; napi_create_arraybuffer(env, sizeof(type), &data, &result2); memcpy(data, type, sizeof(type)); return result2;
審核編輯 黃宇
-
接口
+關注
關注
33文章
8496瀏覽量
150834 -
鴻蒙
+關注
關注
57文章
2307瀏覽量
42738 -
HarmonyOS
+關注
關注
79文章
1967瀏覽量
30015
發布評論請先 登錄
相關推薦
評論