如何桥接 JavaScript(不规则)数组和 std::vector> 对象



在JavaScript中,我有一个"行"列表,每个"行"由无限数量的"点"组成,每个点都有一种[x, y]的形式。所以它是一个 3D 参差不齐的阵列。现在我需要在 emscripten (embind) 的帮助下将其传递给我的C++代码。下面是C++函数的声明:

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

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

更新:我现在可以将 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

有什么想法吗?

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

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 中是不可能的。

最新更新