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

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将这些对象传递给需要它们的方法或静态函数
此外,在尝试简化包装C++库以便通过node.js访问时,是否有比v8-juice / cvv8更好的工具?

真的很需要像boost.python一样的boost.js。您可以使用SWIG完成此操作。有些人似乎喜欢SWIG,但我更喜欢在boost python中获得的控制权。 - CashCow
2个回答

2

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


-8

这取决于您使用的浏览器,但大多数浏览器都是通过COM在C++和JavaScript之间进行互操作。


Node.js 是一个服务器端 JavaScript 环境,与浏览器无关。 - Brandon Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接