4

我正在尝试包装一个将对象作为输入的 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 访问它们?

4

2 回答 2

2

node-canvasnode-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 插件文档

于 2013-01-18T18:37:08.617 回答
-8

这取决于您使用的浏览器,但其中大多数 C++ 和 JavaScript 之间的互操作是通过 COM 完成的。

于 2012-09-28T00:42:20.963 回答