例子1: 传递int数组给wasm数组
int* t; void EMSCRIPTEN_KEEPALIVE init(int* p) { t=p; return 1; }
调用init时,函数
let arrays = new Array(10).fill(0); let size = arrays.length; //ptr是偏移量, let ptr = Module._malloc(size * 4); let segment = new Int32Array(size); for (let i = 0; i < length1; i++) { segment[i] = arrays[i]; } //这里要除以4, 由于 HEAP32是32位,因此 1偏移 = 4字节 Module.HEAP32.set(segment, ptr >> 2); //这里就好了 Module._init(ptr)
例子2: wasm函数返回long数组code
long long* t; long long* EMSCRIPTEN_KEEPALIVE call() { return t; }
js端调用Module._call()后,返回的是数组t的地址,内存
let resultOffset = Module._call(); //根据偏移获取内容 let memory = Module.HEAPU8.subarray(resultOffset, resultOffset) //尝试了一下,直接用memory.buffer初始化DataView,会致使获取不到数据,全部从新建立了一个Uint8Array保存结果 let resultLenth = 返回数组长度 let arrayBuffer = new Uint8Array(resultLenth); for (let i = 0; i < resultLenth; i++) { arrayBuffer[i] = memory[i]; } let dataView = new DataView(arrayBuffer.buffer, 0, resultLenth); let TopResult = new Array(返回数组长度); // 内存中数据是小端模式;i要间隔8,由于一个BigInt读取8字节 for (let i = 0, index = 0; i < size; i += 8, index++) { TopResult[index] = dataView.getBigInt64(i, true) }