如何桥接JavaScript(参差不齐)数组和std :: vector <std :: vector <t>&gt;宾语?

时间:2016-02-18 23:22:24

标签: javascript c++ eigen emscripten

在JavaScript中,我有一个&#34;行&#34;的列表,每个行包含无限数量的&#34;点&#34;,每个点都有[x, y]的形式。所以它是一个3D衣衫褴褛的阵列。现在我需要在emscripten(embind)的帮助下将它传递给我的C ++代码。这里是C ++函数的声明:

Eigen::MatrixXd f(const std::vector<std::vector<std::vector<double>>>& lines);

我希望在调用[[m11, m12],[m22, m22],...]后在JavaScript中获取列表(f)。在这种情况下如何编写绑定代码(例如EMSCRIPTEN_BINDINGS内的东西)?

UPDATE :我现在可以将JavaScript数组传递给C ++。绑定部分类似于

typedef std::vector<double> Point;
typedef std::vector<Point> Line;
EMSCRIPTEN_BINDINGS(module) {
  register_vector<Line>("LineArray");
  register_vector<Point>("Line");
  register_vector<double>("Point");
  emscripten::function("f_wrapper", &f_wrapper);
}

其中f_wrapper调用f但返回vector<vector<double>>而不是MatrixXd。现在问题是我只能在调用f_wrapper后获得一个空的JavaScript对象。 JavaScript是

var Module = require('./bind.js'); // the output of em++
var cppAllLines = new Module.LineArray();
// some initialization
var result = Module.f_wrapper(cppAllLines); // an empty "Line" object

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

从C ++函数传递embound向量时,例如

std::vector<std::vector<double>> f_wrapper(...);

到Javascript

var result = Module.f_wrapper(...);

result对象不是实现length属性或数组索引访问的Javascript数组,因此如果使用这些访问其数据,它可能显示为“空”。

但它确实公开getsize函数来访问向量:

console.log('Back from C++', result.size(), result.get(0).get(1));

(双get是因为我们正在返回向量的向量)

为了完整性,查看返回对象的原型,它似乎暴露了以下函数。

  • get
  • push_back
  • resize
  • set
  • size

稍微不一致地暴露getset函数而不是C ++ at函数的等价物。我怀疑完全等效的函数是不可能的,因为at返回一个允许它用作setter的引用,这在Javascript中是不可能的。