1

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

我得到传递值并在c中更改它们以工作,甚至读取arraybuffers并以我想要在C中的方式解释它们,但我只能返回有限的JS值(数字和字符串,如本部分所示https://nodejs .org/api/n-api.html#n_api_functions_to_convert_from_c_types_to_n_api )

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

4

2 回答 2

2

我找到了答案: 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

于 2019-04-20T10:01:08.790 回答
1

我不知道这是否有帮助(我对 N-API 也比较陌生。)但是您可以从 avoid*和固定长度创建一个数组缓冲区: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
}
于 2019-04-11T13:53:08.440 回答