如何将char *数组传递给emscripten编译代码?

时间:2017-10-25 23:40:44

标签: javascript c++ arrays emscripten

我试图将char*数组传递给Emscripten编译函数,并且还没有弄清楚如何正确地执行此操作。

到目前为止,我发现的所有示例(herehere)都是关于传递数字数组,但不能直接应用于char*数组。 Emscripten docs提到类型数组必须为Unit8ArrayInt8Array

  

第三个是参数类型数组...“array”(对应于的JavaScript数组或类型数组)   一个C数组;对于类型化数组,它必须是Uint8Array或Int8Array)...

这是否意味着我们需要将字符串数组转换为这些格式中的任何一种并将其还原为C ++端?而且,JS数组和类型化数组之间的区别是什么?我不认为数字数组需要这种显式转换。

JS代码:

var myFunc = Module.cwrap('myFunc', 'number', ['string', 'array', 'number']);
var strArr = ['abc', 'def', 'ghi', 'jkl'];
var rst = myFunc('abc', strArr, 0);

C ++代码:

int myFunc(char* str, char** strArr, int i) {
  std::cout << "[C++] The i is " << i << std::endl; // 0
  std::cout << "[C++] The str is " << str << std::endl; // abc
  std::cout << "[C++] The strArr[i] is " << strArr[i] << std::endl; // not 'abc' ??
  return strcmp(str, strArr[i]);
}

1 个答案:

答案 0 :(得分:1)

我们可以将strArr转换为char** JavaScript方面。但是如果你修改c ++代码,Embind会更好。

var myFunc = Module.cwrap('myFunc', 'number', ['string', 'number', 'number']);

Runtime.stackSave();
var strArr = ['abc', 'def', 'ghi', 'jkl'];
var ptrArr = Runtime.stackAlloc(strArr.length * 4);
for (var i = 0; i < strArr.length; i++) {
    var len = strArr[i].length + 1;
    var ptr = Runtime.stackAlloc(len);
    stringToUTF8(strArr[i], ptr, len);
    Module.setValue(ptrArr + i * 4, ptr, "i32");
}
var rst = myFunc('abc', ptrArr, 1);
Runtime.stackRestore();