【问题标题】:Passing array to c++ .wasm module. Emscripten将数组传递给 c++ .wasm 模块。授权
【发布时间】:2021-02-16 18:36:10
【问题描述】:

我有一个包含相应图像的掩码数据的数组,我需要将其传递给用 emscripten 编译的 c++ 函数。掩码数组由 -1 到 255 的值组成,所以我猜必须使用 Int16Array 来表示这些值。是否可以将此数组作为指向 wasm 模块的指针传递?我知道我必须分配内存并传递指针,但我被困在下面的代码上。如何正确分配和设置指针,以便 c++ 函数看到正确的数据?

得到的maskData为:

const mData = ctx.getImageData(0, 0, canvas.width, canvas.height);

        var data = Array.prototype.slice.call(mData.data);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    let data = imageData.data;

    const dataLength = data.length;
    const maskDataLength = maskData.length;

    var dataPointer = Module._malloc(dataLength * data.BYTES_PER_ELEMENT);
    var maskDataPointer = Module._malloc(maskDataLength * 2);

    Module.HEAPU8.set(data, dataPointer);
    Module.HEAP16.set(maskData, maskDataPointer);

    let result = Module.ccall(
      "process",
      "number",
      ["number", "number", "number", "number", "number"],
      [dataPointer, dataLength, maskDataPointer, pos, neg]
    );

    data = new Int16Array(Module.HEAP16.buffer, result, dataLength);

    Module._free(dataPointer);
    Module._free(maskDataPointer);
    Module._free(result);

【问题讨论】:

    标签: javascript c++ memory webassembly emscripten


    【解决方案1】:

    maskPointer表示HEAP8的索引,所以除以2可以访问HEAP16。

    Module.HEAP16.set(maskData, maskDataPointer >> 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 2021-04-21
      • 2017-12-01
      • 1970-01-01
      • 2016-11-30
      • 2018-02-10
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多