【问题标题】:How do I properly create a Buffer object from a node native addon?如何从节点本机插件正确创建 Buffer 对象?
【发布时间】:2017-01-20 14:34:53
【问题描述】:

我正在使用节点 6.9.1,并尝试创建一个 cpp 插件来创建节点缓冲区对象。经过一番研究,我想出了以下代码:

#include <node.h>
#include <node_buffer.h>
#include <v8.h>

using v8::Local;
using v8::Object;
using v8::HandleScope;
using v8::Isolate;

Local<Object> create_buffer(Isolate* isolate, char* rawData, int length) {
  HandleScope scope(isolate);
  Local<Object> buf = node::Buffer::New(
    isolate,
    rawData,
    length).ToLocalChecked();
  return buf;
}

我使用如下:

Local<Value> buff = create_buffer(isolate, rawData, length);
const unsigned argc = 1;
Local<Value> argv[argc] = { buff };
cb->Call(Null(isolate), argc, argv);

这段代码编译得很好,但是当我通过回调访问缓冲区的 .length 属性时会导致错误:

Security context: 0x9d84c7cfb51 <JS Object>#0#

我找到了几个教程,但它们都使用 v8/node api 的早期版本,我找不到任何信息,什么是在最近的 Node 版本中创建缓冲区的正确方法。我也有可能在某个地方犯了错误。如果您能引导我朝正确的方向前进,请提前致谢。

【问题讨论】:

  • 看来我应该只用nan

标签: c++ node.js node.js-addon


【解决方案1】:

最好的方法是使用 NAN 的NewBuffer helper:

Nan::MaybeLocal<v8::Object> mybuffer = Nan::NewBuffer(size);
Nan::MaybeLocal<v8::Object> mybuffer = Nan::NewBuffer(mydata, size);

Node 的node_buffer.h 也有一个公共构造函数,但它不一定跨版本一致。

我不肯定,但您的错误可能是因为您释放了用于构建缓冲区的原始数据?

【讨论】:

  • 谢谢,Nan 很好用。我想知道我什么时候可以释放我的数据?我可以在创建缓冲区后释放数据吗?或者我应该在根本不需要缓冲区时释放它?
  • @OleksiiRudenko 如果您使用这些帮助程序,那么 v8 将拥有内存,并在缓冲区被 GC 时为您释放它。如果您需要更多控制权,我没有列出第三种形式(单击链接),它可以让您传递FreeCallback。最后,您可以使用Nan::CopyBuffer(相同的文档页面),它将memcpy 数据,以便您保留对原始数据的控制。
猜你喜欢
  • 2021-12-21
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多