Emscripten:JS 调用 C、C++
在 了解 Emscripten 中,给大家简单分享了 Emscripten
是什么以及其使用场景。今天继续分享如何使用 JS 调用 C/C++ 代码。
神奇的 main 函数
下面是 了解 Emscripten 中的例子代码,只有一个 main
函数。
1 | #include <stdio.h> |
使用 Emscripten SDK
编译后生成了对应的 html、js 和 wasm 文件。
第一次编译会较慢, 编译完成后会在 ~/.emscripten_cache
生成缓存目录和缓存文件, 以后再次编译就比较快了.
可以在火狐或者 Chrome
或者 Safari
上面运行 h_emcc.html
文件.
这里在火狐浏览器上面可以直接打开 mz.html
文件, 如果是在 Chrome
或者 Safari
需要执行下面命令:
1 | emrun mz.html |
或者指定浏览器打开该文件.
1 | emrun --browser chrome mz.html |
关于 emrun
的其他用法,可以使用 emrun --help
来查看。这里在浏览器可以看到对应 main
函数的输出,说明 Emscripten
生成的代码默认会调用 main
函数。
EMSCRIPTEN_KEEPALIVE
既然 Emscripten
生成的代码默认会调用 main
函数,那么如果想使用其他函数怎么办呢?
我们可以在函数前添加 EMSCRIPTEN_KEEPALIVE
,它在emscripten.h
文件中有声明,这个可以通过源码查看。
下面还是举个例子来说明。
my.html
1 |
|
里面引用了 hello3.js
并且使用 Module.ccall
调用了 C 函数 sum
。
hello.c
1 |
|
编译 hello.c
1 | emcc -o hello.html hello.c -O3 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']" |
注意:EXTRA_EXPORTED_RUNTIME_METHODS
设置了 Module 的导出函数,不导出 ccall
的话,会报以下错误:
1 | 'ccall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ) |
现在可以运行 my.html
1 | emrun my.html |
可以修改一下 sum 函数,使其带参数,修改如下:
1 |
|
需要修改 my.html
文件,修改内容如下:
1 | var result = Module.ccall('sum', // name of C function |
注意 argument types
和 arguments
的填写,运行可以看到预期效果。
扫码关注,你我就各多一个朋友~