Emscripten 字符串传值

CC文件(C++)C文件(C),由于使用了string所以用CC文件代码如下

#include <stdio.h>
#include <string>
#include <emscripten/emscripten.h>
int main(int argc, char ** argv) {
    printf("Hello World\n");
}
#ifdef __cplusplus
extern "C" {
#endif
char * EMSCRIPTEN_KEEPALIVE myFunction (int i,char * argv) {
  printf("%d\n",i);
  return argv;
}
#ifdef __cplusplus
}
#endif

编译:emcc decrypt-wasm.cc -s WASM=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']"

注意这里导出了一个胶水函数:ccall,默认会生成a.out.js

Heml、JavaScript代码:

<!DOCTYPE html>
<html>
<head>
  <title></title> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <script type="text/javascript" src="a.out.js"></script>
  <script type="text/javascript">
    Module['onRuntimeInitialized'] = onRuntimeInitialized;
    function onRuntimeInitialized() {
      var result = Module.ccall('myFunction', // name of C function 
                                 String, // return type
                                 ['number','string'], // argument types
                                 [11,'1111']); // arguments
      console.log(UTF8ToString(result));
    }
  </script> 
</head>
<body>
</body>
</html>

效果

屏幕快照 2020-03-29 下午5.01.47.png

新版本的EMCC已经更改了一些获取返回值的方式,可以查看a.out.js导出的胶水代码,里面有一些函数返回值或者其它的处理。

传递数组

C

typedef struct 
{ 
uint32_t number;
    char* pass;
} Exxxxx;
Exxxxx * EMSCRIPTEN_KEEPALIVE cccc (int rands,char * argv) {
    Exxxxx *result = (Exxxxx *)malloc(sizeof(Exxxxx)); 
    return result;
}

JavaScript

function aaaa(_num,_str){
     var result = Module.ccall('cccc',
                                 Array, 
                                 ['number','string'], 
                                 [_num,_str]); 
          let __useless = Module.HEAPU32[result / 4],__key = UTF8ToString(Module.HEAPU32[result / 4+1] );
     return [__useless,__key];   
}



Emscripten 字符串传值


关注小程序 [上下博客] 扫码手机完整阅读

标签: c++, wasm, emcc

添加新评论