2

我正在尝试使用节点插件 api (N-NAPI)为 C++ 库Clip构建一个node-js 包装器。我想从用户的剪贴板中检索图像并将其传递给 node.js 缓冲区中的 JavaScript。

这是我尝试过的:(只有相关部分,其余部分在这里

Napi::Object get_image(const Napi::CallbackInfo& args) {
  Napi::Env env = args.Env();

  clip::image img;
  clip::get_image(img);

  clip::image_spec spec = img.spec();

  char *pixels = img.data();
  // since I dont know the length of pixels I use the width * height of the image
  Napi::Buffer<char> img_buffer = Napi::Buffer<char>::New(env, pixels, spec.width * spec.height);
  return img_buffer;
}

这编译得很好,但是当我尝试在 JavaScript 中使用它时,它会生成一个Segmentation fault (core dumped).

示例 JS 代码:

const clip = require('bindings')('node_clip_wrapper')
console.log(clip.getImage())

我该如何解决这个问题?如果我遗漏了一些基本的东西,请原谅,我对 C++ 和构建节点插件非常陌生。

4

2 回答 2

1

解决方案是使用Napi::Buffer::Copy而不是New. 文档

像这样:

Napi::Buffer<char> img_buffer = Napi::Buffer<char>::Copy(env, pixels, spec.width * spec.height);
于 2019-11-13T23:22:30.783 回答
1

我认为这不是Napi::Buffer::Copy一个好的解决方案,因为复制基础数据很昂贵。

Napi::Buffer::New只要您保持内存处于活动状态,直到 JavaScript 代码使用 Buffer 对象完成,它就应该可以工作。pixels在您的情况下,一旦函数返回,指向的数据就会被取消分配。

您也可以使用外部缓冲区 API 自行管理内存: https ://nodejs.org/api/n-api.html#napi_create_external_arraybuffer

于 2020-01-20T08:17:07.307 回答