一、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]);
})
四、结果输出
我是字符串
111
3.141592634571