例子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数组
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)}