Emscripten传递STL C ++映射参数

时间:2019-04-29 14:09:32

标签: emscripten

我不知道如何调用以下功能的JS生成的代码:

void printmap(const map<string, vector<string> > &ms)
{
    map<string, vector<string> >::const_iterator m1i;
    for (m1i = ms.begin(); m1i != ms.end(); m1i++)
    {
        printf("%s:\n", m1i->first.c_str());
        vector<string>::const_iterator m2i;
        for (m2i = m1i->second.begin(); m2i != m1i->second.end(); m2i++)
            printf("\t%s\n", m2i->c_str());
    }
}

更具体地说,JS准备“ ms”参数是什么样子?

2 个答案:

答案 0 :(得分:0)

您可以在JS中调用您的printmap()

WebAssembly当前为defines number types only:32/64位整数/浮点数。由于此限制,Emscripten编译的WASM代码可以通过以下类型与JS交互:

  1. 数字类型(整数和浮点数)
  2. 指针类型(通过将整数视为WASM存储器地址0x00000000的偏移量)
    • 字节(或整数)数组的指针
    • 字符串的指针(尽管它是isn't simple
    • 类实例的指针(通过Embind

我不知道如何,但是指针和引用的行为不同,thus you cannot use a reference type to interact with JS

您可能在这里猜到,没有办法像map<string, vector<string>这样的复杂C ++类型。

我总结一下,为您提供一些建议:

  1. 将引用类型更改为指针。

void printmap(const map<string, vector<string> > &ms)

void printmap(const map<string, vector<string> > *ms)

  1. ms编写一个初始化函数,以便您可以在JS中执行以下操作:
let map_ptr = module._initmap();
...Do something..
module._printmap(map_ptr);
  1. 只需避免直接在JS端使用此类复杂的C / C ++类型,或者为ms创建getter和setter函数。

答案 1 :(得分:0)

使用Embind map and vector

几乎是可行的

网站示例: C ++代码

mass_kilograms

Js代码

    #include <emscripten/bind.h>
    #include <string>
    #include <vector>

    using namespace emscripten;

    std::vector<int> returnVectorData () {
      std::vector<int> v(10, 1);
      return v;
    }

    std::map<int, std::string> returnMapData () {
      std::map<int, std::string> m;
      m.insert(std::pair<int, std::string>(10, "This is a string."));
      return m;
    }

    EMSCRIPTEN_BINDINGS(module) {
      function("returnVectorData", &returnVectorData);
      function("returnMapData", &returnMapData);

      // register bindings for std::vector<int> and std::map<int, std::string>.
      register_vector<int>("vector<int>");
      register_map<int, std::string>("map<int, string>");
    }

以上述摘录作为参考,不难达到您的要求。