WebAssembly 匯出c結構體 js獲取 補充篇
阿新 • • 發佈:2020-07-12
c程式碼:
#include<emscripten/emscripten.h> #include<stdlib.h> typedef struct { unsigned char * str; int a; double c; }data; data d = {(unsigned char *)"我是字串",111,3.141592634571}; data* EMSCRIPTEN_KEEPALIVE getData(){ return &d; }
emscripten編譯命令
emcc main.c -s WASM=1-s MODULARIZE=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=["UTF8ToString"] -s EXPORT_NAME="WasmModule" -s ENVIRONMENT=web -o index.js
js呼叫程式碼
WasmModule().then(mod => { //sPtr 是結構體的指標 let sPtr = mod._getData(); //mod.HEAP32[sPtr >> 2] 取到字串的地址//mod.UTF8ToString 把c串地址轉化為js字串 console.log(mod.UTF8ToString(mod.HEAP32[sPtr >> 2])); //HEAP32代表int型別佔四位元組 所以下面需要加4 並且取到int型別的值 console.log(mod.HEAP32[sPtr + 4 >> 2]); //mod.HEAPF64 代表double型別 取結構體第三個資料 地址需要加上第一個與第二個值得位元組數所以加8 console.log(mod.HEAPF64[sPtr + 8>> 3]); })
結果輸出: