WebAssembly01-- 暴露接口 避免编译时优化

将接口暴露出来

在test.c 中直接写出如下所示的代码

vim test.c

#include<stdio.h>
int add(int a,int b)
{
        return a+b;
}
int main(int argc,char** argv)
{
        return add(1,2);

}


使用
emcc test.c -O2 -o test.js 编译之后
手动写个test.html

<html>
  <head>
    <title>test page</title>
  </head>
  <body>
    <script src="test.js"></script>
  </body>
</html>

emrun --no_browser --port 8000 test.html

在浏览器中访问这个
可以在下图中看不到add函数 并且调用add函数的main中return 直接是3

现在使用
vim test.c

#include<stdio.h>
#include<emscripten.h>

EMSCRIPTEN_KEEPALIVE int add(int a,int b)
{
        return a+b;
}
int main(int argc,char** argv)
{
        return add(1,2);

}

修改之后重新编译并运行emcc emrun
如下所示 add接口被暴露出来

不导出main函数

增加 --no-entry 即可避免main接口的暴露
emcc test.c --no-entry -O2 -o test.js
emrun --no_browser --port 8000 test.html
下图中可以看到add接口但是没有main

暴露接口的调用

Module调用方式

在test.html 中修改为如下

<html>
    <head>
          <title>test page</title>
    </head>
    <body>
          <script >
          Module={}
          Module.onRuntimeInitialized=function(){
            console.log("add:"+Module._add(3,5))
          }   
          </script>
          <script src="test.js"></script>
    </body>
</html>

emrun --no_browser --port 8000 test.html

接口的调用过程

首先定义一个空的Module对象 给Module对象的onRuntimeInitialized设置了回调函数,然后 使用script标签引入test.js胶水文件 完善Module对象的其他属性,在Module对象初始化完成之后执行回调onRuntimeInitialize()方法 该方法调用Module对象的_add方法,并打印出来结果。

ccall调用方式

var result = Module.ccall(func_name,return_type,arg_types,args);
  • func_name 是要调用的c/c++函数名这里不需要加下划线
  • return_type函数返回类型字符串 比如返回类型是string 这里就应该填入string
  • arg_type调用函数的参数类型列表 比如需要传入两个字符串 则应该写成['string','string']
  • args 真实的参数 比如传入是的 “hello” "world" 则写成 ["hello","world"]
posted @ 2022-10-11 15:31  simp00  阅读(166)  评论(0编辑  收藏  举报