WebAssembly 导出c结构体 js获取 补充篇

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]);

        })

结果输出:

 

posted @ 2020-07-12 18:37  y-y-y-y  阅读(794)  评论(0编辑  收藏  举报