使用 node-api 将 arraybuffer 从 C 转发到 JS

Forward arraybuffer from C to JS with node-api

我目前正在尝试使用 JS 进行一些低级编码。 出于这个原因,我使用 https://nodejs.org/api/n-api.html 将自定义 C 代码添加到我的 node.js 运行时。

我得到传递值并在 c 中更改它们以工作,甚至读取数组缓冲区并按照我在 C 中想要的方式解释它们,但我只能 return 有限的 JS 值(数字和字符串,如看到这部分https://nodejs.org/api/n-api.html#n_api_functions_to_convert_from_c_types_to_n_api)

有人知道如何获得 N-API 个数组缓冲区吗?我想给我的 JS 一个我在 C 中定义的缓冲区,然后通过 Dataviews 工作。

我不知道这是否有帮助(我对 N-API 也比较陌生。)但您可以从 void* 和固定长度创建数组缓冲区:https://nodejs.org/api/n-api.html#n_api_napi_create_arraybuffer

例如:

napi_value CreateArrayBuffer(napi_env env, napi_callback_info info) {
  // the value to return
  napi_value arrayBuffer;

  // allocates 100 bytes for the ArrayBuffer
  void* yourPointer = malloc(100 /* bytes */);

  // creates your ArrayBuffer
  napi_create_arraybuffer(env, 100 /* bytes */, &yourPointer, &arrayBuffer);

  return arrayBuffer; // ArrayBuffer with 100 bytes length
}

我找到了答案: https://nodejs.org/api/n-api.html#n_api_napi_create_external_arraybuffer

我一直在寻找与“外部”不同的关键字,但这正是我要找的: 您事先在 C 中定义了一个缓冲区,然后创建了一个使用该底层缓冲区的 NAPI/JS 数组缓冲区。 napi_create_arraybuffer 会清除缓冲区,然后也可以在 C 中对其进行操作,但您不能,例如加载一个文件,然后使用该缓冲区。所以 napi_create_external_arraybuffer 是要走的路。

编辑:当我问这个问题时我正在写我的开源学士论文,所以我最后是这样使用它的:https://github.com/ixy-languages/ixy.js/blob/ce1d7130729860245527795e483b249a3d92a0b2/src/module.c#L112