javascript - 在 Nodejs/V8 扩展中通过 Javascript 将 C++ 对象传递给 C++ 函数

标签 javascript c++ node.js v8 cvv8

我正在尝试包装一个将对象作为输入的 C++ 函数,以便可以通过 Nodejs 访问它。这是一个简单的例子来展示我正在尝试做的事情。

假设在 C++ 中,

struct query {
  string m_foo;
  string m_bar;

  query(string foo, string bar)
   :m_foo(foo), m_bar(bar) {}
}

static string ExecuteQuery(query q); // Implemented somewhere

我希望在 Javascript (node.js) 中能够做到,

 var q = new plugin.query("foo", "bar");
 var result = plugin.ExecuteQuery(q);

我发现的所有 nodejs C++ 插件示例都使用简单的数据类型和相当简单的示例。做这样的事情有什么好的例子或模式吗?由于缺乏 v8 文档和制作插件的繁琐/冗长语法,我自己在这方面运气不佳。

需要,

  • 能够使用 Javascript 创建 C++ 对象
  • 能够通过 Javascript 将这些对象传递给需要它们的方法或静态函数

另外,有没有比 v8-juice/cvv8 更好的东西来尝试简化包装 C++ 库的过程,以便它们可以通过 node.js 访问?

最佳答案

Node Canvas node-canvas TJ Holowaychuk 在展示 C++ 中的对象包装示例以传回并在 javascript 端使用方面做得非常出色。

我将在下面摘录一个示例与您分享它是如何完成的。

来自 Image.h

class Image: public node::ObjectWrap {

来自 Image.cc

Persistent<FunctionTemplate> Image::constructor;
...
Handle<Value>
Image::New(const Arguments &args) {
  HandleScope scope;
  Image *img = new Image;
  img->data_mode = DATA_IMAGE;
  img->Wrap(args.This());
  return args.This();
}

另一个例子是 Canvas对象

class Canvas: public node::ObjectWrap {

来自Canvas.cc

Handle<Value>
Canvas::New(const Arguments &args) {
  HandleScope scope;
  int width = 0, height = 0;
  canvas_type_t type = CANVAS_TYPE_IMAGE;
  if (args[0]->IsNumber()) width = args[0]->Uint32Value();
  if (args[1]->IsNumber()) height = args[1]->Uint32Value();
  if (args[2]->IsString()) type = !strcmp("pdf", *String::AsciiValue(args[2]))
    ? CANVAS_TYPE_PDF
    : CANVAS_TYPE_IMAGE;
  Canvas *canvas = new Canvas(width, height, type);
  canvas->Wrap(args.This());
  return args.This();
}

一旦需要 node-canvas 模块,它就像访问任何其他 javascript 对象一样容易。

fs.readFile(__dirname + '/someFile.jpg', function(err, image_data){
  var Canvas      = require('canvas');  
  var Image       = Canvas.Image;
  var img = new Image;
  img.onload = function() {
    var canvas = new Canvas(img.width,img.height);
    var ctx = canvas.getContext('2d');
    // grab and modify pixel data etc
  }
  img.src = image_data;
}

有关 ObjectWrap 的解释,请参阅 nodejs addon docs .

关于javascript - 在 Nodejs/V8 扩展中通过 Javascript 将 C++ 对象传递给 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12632016/

相关文章:

node.js - 是否可以使用nano通过node.js在cloudant(couchdb)中动态添加 View

javascript - Cookies 没有通过 relayjs 在 graphql 请求中传递到移动浏览器中

javascript - 切换大小写字符串正则表达式和数字

javascript - 如何在 FullCalendar 的顶部显示时间?

c++ - 使用opencv从二进制图像中删除半曲面对象

c++ - 类型转换元函数

node.js - pm2日志,打印 "PM2 Unknown id 77"

node.js - 加速 Socket.IO

javascript - AngularJs - 使用 $parent ng-model 从 Controller 更改/推送选择颜色

c++ - tcp 零窗口和对其他套接字的影响