当前位置:   article > 正文

C++对JS Object的操作_napi_get_array_length

napi_get_array_length

C++ 侧对JS Object的基本操作

N-API提供一些API来创建JavaScript所有类型值。这些API用于执行以下操作:

  • 创建一个新的JavaScript对象
  • 将C类型数据转换成N-API类型数据
  • 将N-API类型数据转换成C类型数据

场景:创建一个 Object,并对其属性赋值

N-API 写法(注释代码是相应的 JS 写法)
  1. // let obj = {}
  2. napi_value obj;
  3. napi_create_object(env, &obj);
  4. // let world = "world"
  5. napi_value world;
  6. napi_create_string_utf8(env, "world", NAPI_AUTO_LENGTH, &world);
  7. // let arr = []
  8. napi_value arr, arrElement0, arrElement1, arrElement2;
  9. napi_create_array(env, &arr);
  10. // arr[0] = 94
  11. napi_create_int32(env, 94, &arrElement0);
  12. napi_set_element(env, arr, 0, arrElement0);
  13. // arr[1] = "123d"
  14. napi_create_string_utf8(env, "123d", NAPI_AUTO_LENGTH, &arrElement1);
  15. napi_set_element(env, arr, 1, arrElement1);
  16. // arr[2] = 12.32
  17. napi_create_double(env, 12.32, &arrElement2);
  18. napi_set_element(env, arr, 2, arrElement2);
  19. // let obj1 = {}
  20. napi_value obj1, objValue;
  21. napi_create_object(env, &obj1);
  22. // let objValue = "obj in obj"
  23. napi_create_string_utf8(env, "obj in obj", NAPI_AUTO_LENGTH, &objValue);
  24. // obj1["test"] = objValue
  25. napi_set_named_property(env, obj1, "test", objValue);
  26. // obj["hello"] = world
  27. // obj["arr"] = arr
  28. // obj["obj1"] = obj1
  29. napi_set_named_property(env, obj, "hello", world);
  30. napi_set_named_property(env, obj, "arr", arr);
  31. napi_set_named_property(env, obj, "obj1", obj1);

C++ 侧对 Object 类型数据属性修改

场景:js 端向 C++ 端传入 Object 类型数据,C++端对其属性就行修改后,返回给 js 端。 注:建议先学习 JS TypedArray

接收参数
js 调用 C++ 导出方法 modifyObject,并传参
  1. Row() {
  2. Text("ModifyObject")
  3. .fontSize(50)
  4. .fontWeight(FontWeight.Bold)
  5. .onClick(() => {
  6. const typedArray = new Uint8Array(6);
  7. typedArray[0] = 127;
  8. typedArray[2] = 66;
  9. typedArray[4] = 32;
  10. const obj: {
  11. obj1: Object,
  12. hello: String,
  13. arr: Array<any>,
  14. typedArray: Uint8Array
  15. } = {
  16. hello: 'world',
  17. arr: [94, '123d', 12.32, { test: 'obj in arr'}],
  18. obj1: {
  19. test: 'obj in obj'
  20. },
  21. typedArray
  22. }
  23. hilog.info(0x0000, 'napiTestTag', 'Test NAPI modifyObject result is %{public}s', JSON.stringify(testNapi.modifyObject(obj)));
  24. })
  25. }
C++ 解析参数
  1. static napi_value modifyObject(napi_env env, napi_callback_info info) {
  2. // 数组的长度并接收参数的实际计数
  3. size_t argc = 1;
  4. napi_value args[1] = { nullptr };
  5. napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  6. // js端传过来的参数
  7. napi_value obj = args[0];
  8. }
修改 Object 类型数据(注释代码是相应的 JS 写法)
N-API 写法
  1. // let obj = {
  2. // hello: 'world',
  3. // arr: [94, '123d', 12.32, { test: 'obj in arr'}],
  4. // obj1: {
  5. // test: 'obj in obj'
  6. // }
  7. // }
  8. napi_value obj = args[0];
  9. // let world0 = "world0";
  10. // obj['hello'] = world0
  11. napi_value world0;
  12. napi_create_string_utf8(env, "world0", NAPI_AUTO_LENGTH, &world0);
  13. napi_set_named_property(env, obj, "hello", world0);
  14. // let arr = obj['arr'];
  15. // delete arr[2];
  16. napi_value arr;
  17. napi_get_named_property(env, obj, "arr", &arr);
  18. napi_delete_element(env, arr, 2, nullptr);
  19. // let arrLen;
  20. // arrLen = arr.length;
  21. uint32_t arrLen;
  22. napi_get_array_length(env, arr, &arrLen);
  23. // for(let i = 0; i < arrLen; i++) {
  24. // let tmp = i;
  25. // arr[i] = tmp;
  26. // }
  27. uint32_t i = 0;
  28. for(i = 0; i < arrLen; i++) {
  29. napi_value tmp;
  30. napi_create_uint32(env, i, &tmp);
  31. napi_set_element(env, arr, i, tmp);
  32. }
  33. // let typedArr = obj['typedArray']
  34. napi_value typedArr;
  35. napi_get_named_property(env, obj, "typedArray", &typedArr);
  36. bool is_typedarray;
  37. NODE_API_CALL(env, napi_is_typedarray(env, typedArr, &is_typedarray));
  38. // let input_buffer = typedArr.buffer
  39. // let byte_offset = typedArr.byteOffset
  40. // let length = typedArr.length
  41. napi_typedarray_type type;
  42. napi_value input_buffer;
  43. size_t byte_offset;
  44. size_t length;
  45. NODE_API_CALL(env, napi_get_typedarray_info(env, typedArr, &type, &length, NULL, &input_buffer, &byte_offset));
  46. // 获取 input_buffer 的基础数据缓冲区 data,和基础数据缓冲区的长度 byte_length。
  47. void* data;
  48. size_t byte_length;
  49. NODE_API_CALL(env, napi_get_arraybuffer_info(env, input_buffer, &data, &byte_length));
  50. // 创建新的ArrayBuffer,&output_ptr 指向 ArrayBuffer 的底层数据缓冲区的指针
  51. napi_value output_buffer;
  52. void* output_ptr = NULL;
  53. NODE_API_CALL(env, napi_create_arraybuffer(env, byte_length, &output_ptr, &output_buffer));
  54. // 使用 output_buffer 创建 typedarray
  55. napi_value output_array;
  56. NODE_API_CALL(env, napi_create_typedarray(env, type, length, output_buffer, byte_offset, &output_array));
  57. // data 是由连续的内存位置组成,(uint8_t*)(data) 表示其第一个元素的内存地址。
  58. // data 是旧的 arraybuffer 数据指针
  59. uint8_t* input_bytes = (uint8_t*)(data) + byte_offset;
  60. // 把 output_ptr 指针赋值给 output_bytes
  61. // output_ptr 是新的 arraybuffer 数据指针
  62. uint8_t* output_bytes = (uint8_t*)(output_ptr);
  63. for (i = 0; i < length; i++) {
  64. // 将旧 arraybuffer 数据每一个元素乘 2,赋值给新 arraybuffer 数据
  65. output_bytes[i] = (uint8_t)(input_bytes[i] * 2);
  66. }
  67. // 将新 typedArray 赋值给 obj['typedArray']
  68. napi_set_named_property(env, obj, "typedArray", output_array);
  69. // let obj1 = obj['obj1'];
  70. napi_value obj1;
  71. napi_get_named_property(env, obj, "obj1", &obj1);
  72. // let str = obj1['test'];
  73. // let buf = str;
  74. // buf += ",this is be modified";
  75. napi_value str;
  76. napi_get_named_property(env, obj1, "test", &str);
  77. char buf;
  78. size_t bufSize = 20;
  79. size_t res;
  80. napi_get_value_string_utf8(env, str, &buf, bufSize, &res);
  81. strcat(&buf, ",this is be modified");
  82. // obj1['test'] = buf;
  83. napi_value newNapiStr;
  84. napi_create_string_utf8(env, &buf, NAPI_AUTO_LENGTH, &newNapiStr);
  85. napi_set_named_property(env, obj1, "test", newNapiStr);
  86. napi_set_named_property(env, obj, "obj1", obj1);
修改后输出:
Test NAPI modifyObject result is {"hello":"world0","arr":[0,1,2,3],"obj1":{"test":"obj in obj,this is be modified"}}

相关API

创建 Object
C 类型数据转换成 N-API 类型数据
N-API 类型数据 转换成 C 类型数据
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/339390
推荐阅读
相关标签
  

闽ICP备14008679号