如何桥接 JavaScript(参差不齐)数组和 std::vector<std::vector<T>> 对象?

Posted

技术标签:

【中文标题】如何桥接 JavaScript(参差不齐)数组和 std::vector<std::vector<T>> 对象?【英文标题】:How to bridge a JavaScript (ragged) array and an std::vector<std::vector<T>> object? 【发布时间】: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&lt;vector&lt;double&gt;&gt; 而不是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

有什么想法吗?

【问题讨论】:

Related. @AviGinsburg 正好相反。 你能解释一下你为什么说“空” Line 对象吗?根据您的代码,我刚刚创建了一个将 LineArray 从 Javascript 传递到 C++ 函数的小测试,该函数返回一个 Line,并且通信似乎双向工作。我正在使用 Emscripten 1.35.23-64 位。 pastebin.com/9g8vJFc9 和 pastebin.com/P0BmKY3K @MichalCharemza 啊哈!我将它视为一个 JavaScript 数组,因此检查了 result.lengthresult[0] 之类的值,但没有发现任何定义。我应该调查一下emscripten/bind.h,看看register_vector 到底做了什么。现在我可以正常访问内容了。如果您可以将评论写入答案,我愿意接受。谢谢! 【参考方案1】:

当从 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 返回一个允许它用作设置器的引用,这在 Javascript 中是不可能的。

【讨论】:

它会自动管理释放吗?它可以在没有内存泄漏的情况下工作吗? @Sohail 我的怀疑是肯定的,但这可能值得单独提出一个问题。 .get,push_back 函数的文档在哪里,你是如何找到 myVector 的这个 get 函数的?请发个链接thnx @BuddhikaChaturanga 我认为我没有在任何文档中找到它,我检查了浏览器控制台中返回的对象。 @MichalCharemza 感谢兄弟的回复!我试图在这些方法上找到任何 emscripten 参考或文档,但没有找到。这就是我问的原因。

以上是关于如何桥接 JavaScript(参差不齐)数组和 std::vector<std::vector<T>> 对象?的主要内容,如果未能解决你的问题,请参考以下文章

参差不齐和参差不齐的阵列

numpy.testing.assert_array_equal 失败,两个相同的参差不齐的数组数组

原创如何设置Virtual Box虚拟机CentOS7为静态IP地址

原生Javascript(数组操作方法总结)-更新

iOS JavaScript 桥接器

JavaScript中何时使用===,何时使用==