将接口暴露出来
在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"]