【问题标题】:How to pass char* array to emscripten compiled code?如何将 char* 数组传递给 emscripten 编译代码?
【发布时间】:2018-04-07 04:57:18
【问题描述】:

我正在尝试将 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]);
}

【问题讨论】:

    标签: javascript c++ arrays emscripten


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多