美文网首页
鸿蒙开发踩坑计一(二进制数组创建)

鸿蒙开发踩坑计一(二进制数组创建)

作者: Magic旭 | 来源:发表于2024-01-18 11:47 被阅读0次

背景

  1. 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<unsigned char *>(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<NativeEngine*>(env)->GetEcmaVm();
    uint8_t** values = (uint8_t**)(data);
    Local<panda::ArrayBufferRef> res = panda::ArrayBufferRef::New(vm, byte_length);
    if (values != nullptr) {
        *values = reinterpret_cast<uint8_t*>(res->GetBuffer());
    }
    *result = JsValueFromLocalValue(res);

    return GET_RETURN_STATUS(env);
}
  1. 第二种创建方法例子
//接收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;

总结

  1. 多学多练,多交流

相关文章

  • 机器学习 - numpy

    创建数组 查看数组属性 快速创建n维数组的api 创建某一范围的数组 创建随机数组np.random numpy计...

  • 踩坑计

    微信小程序踩坑 textarea中placeholder设置行高(无效)场景: ui设计稿中placeholder...

  • 鸿蒙OS开发之属性动画踩坑

    鸿蒙官方文档中提到的属性动画的执行是在监听点击事件里面进行的,在此之外执行属性动画没有反应,但是没有告诉如何在点击...

  • Android 日常踩坑

    1、Android NDK开发踩坑 踩坑环境 Android Studio 3.4.1,JDK 1.8 1、为什么...

  • org.springframework.

    记录web开发踩过的坑 记录一个后端的小细节, springboot repository创建时, 定义的方法一定...

  • Flutter 开发记录

    Flutter 开发踩坑记录(干货总结)

  • ES6中二进制数组的操作

    ES6中包含一系列的对二进制数组的包装类,用于快捷的创建、存储、操作二进制数组。这些二进制数组被广泛的应用到文件操...

  • 小程序资源

    小程序webview踩坑小程序图片转二进制微信基础库对应关系

  • 2019-08-14

    docker 搭建 gogs,drone , mysql 踩坑记录,防止以后再踩啊 docker 创建 桥接网络...

  • 开发踩坑

    今天在做美团的二级菜单的时候, 使用了一种很原始的方式, 在 li 下直接添加一个 div , 当鼠标 hover...

网友评论

      本文标题:鸿蒙开发踩坑计一(二进制数组创建)

      本文链接:https://www.haomeiwen.com/subject/nrorodtx.html