使用 N-API 时如何避免分段错误?
How to avoid Segmentation fault when using N-API?
我正在尝试使用节点插件 api (N-NAPI) 构建 node-js wrapper for the C++ library Clip。我想从用户的剪贴板中检索图像并将其传递到 node.js 缓冲区中的 JavaScript。
这是我试过的:(只有相关部分,其余部分here)
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++ 和构建节点插件的新手。
解决方案是使用 Napi::Buffer::Copy
而不是 New
。 Documentation
就像这样:
Napi::Buffer<char> img_buffer = Napi::Buffer<char>::Copy(env, pixels, spec.width * spec.height);
我认为 Napi::Buffer::Copy
不是一个好的解决方案,因为复制基础数据的成本很高。
Napi::Buffer::New
只要您保持内存有效,JavaScript 代码就可以工作,直到 Buffer 对象完成。在您的情况下,pixels
指向的数据在函数 returns.
后被取消分配
你也可以使用外部缓冲区API来自己管理内存:
https://nodejs.org/api/n-api.html#napi_create_external_arraybuffer
我正在尝试使用节点插件 api (N-NAPI) 构建 node-js wrapper for the C++ library Clip。我想从用户的剪贴板中检索图像并将其传递到 node.js 缓冲区中的 JavaScript。
这是我试过的:(只有相关部分,其余部分here)
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++ 和构建节点插件的新手。
解决方案是使用 Napi::Buffer::Copy
而不是 New
。 Documentation
就像这样:
Napi::Buffer<char> img_buffer = Napi::Buffer<char>::Copy(env, pixels, spec.width * spec.height);
我认为 Napi::Buffer::Copy
不是一个好的解决方案,因为复制基础数据的成本很高。
Napi::Buffer::New
只要您保持内存有效,JavaScript 代码就可以工作,直到 Buffer 对象完成。在您的情况下,pixels
指向的数据在函数 returns.
你也可以使用外部缓冲区API来自己管理内存: https://nodejs.org/api/n-api.html#napi_create_external_arraybuffer