【发布时间】:2016-02-18 23:22:23
【问题描述】:
在 JavaScript 中,我有一个“线”列表,每个“点”由不定数量的“点”组成,每个点的形式为 [x, y]。所以它是一个 3D 参差不齐的数组。现在我需要在 emscripten (embind) 的帮助下将它传递给我的 C++ 代码。下面是 C++ 函数的声明:
Eigen::MatrixXd f(const std::vector<std::vector<std::vector<double>>>& lines);
并且我想在调用f 后在 JavaScript 中获取列表列表 ([[m11, m12],[m22, m22],...])。这种情况下的绑定代码怎么写(比如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
有什么想法吗?
【问题讨论】:
-
@AviGinsburg 正好相反。
-
你能解释一下你为什么说“空” Line 对象吗?根据您的代码,我刚刚创建了一个将 LineArray 从 Javascript 传递到 C++ 函数的小测试,该函数返回一个 Line,并且通信似乎双向工作。我正在使用 Emscripten 1.35.23-64 位。 pastebin.com/9g8vJFc9 和 pastebin.com/P0BmKY3K
-
@MichalCharemza 啊哈!我将它视为一个 JavaScript 数组,因此检查了
result.length或result[0]之类的值,但没有发现任何定义。我应该调查一下emscripten/bind.h,看看register_vector到底做了什么。现在我可以正常访问内容了。如果您可以将评论写入答案,我愿意接受。谢谢!
标签: javascript c++ eigen emscripten