内容简介:在了解 Emscripten 中,给大家简单分享了下面是了解 Emscripten 中的例子代码,只有一个使用
在了解 Emscripten 中,给大家简单分享了 Emscripten
是什么以及其使用场景。今天继续分享如何使用 JS 调用 C/C++ 代码。
神奇的 main 函数
下面是了解 Emscripten 中的例子代码,只有一个 main
函数。
#include <stdio.h> int main(int argc, char ** argv) { printf("Emscripten show in browser...\n"); }
使用 Emscripten SDK
编译后生成了对应的 html、js 和 wasm 文件。
第一次编译会较慢, 编译完成后会在 ~/.emscripten_cache
生成缓存目录和文件, 以后再次编译就比较快了.
可以在火狐或者 Chrome
或者 Safari
上面运行 h_emcc.html
文件.
这里在火狐浏览器上面可以直接打开 mz.html
文件, 如果是在 Chrome
或者 Safari
需要执行下面命令:
emrun mz.html
或者指定浏览器打开该文件.
emrun --browser chrome mz.html
关于 emrun
的其他用法,可以使用 emrun --help
来查看。这里在浏览器可以看到对应 main
函数的输出,说明 Emscripten
生成的代码默认会调用 main
函数。
EMSCRIPTEN_KEEPALIVE
既然 Emscripten
生成的代码默认会调用 main
函数,那么如果想使用其他函数怎么办呢?
我们可以在函数前添加 EMSCRIPTEN_KEEPALIVE
,它在 emscripten.h
文件中有声明,这个可以通过源码查看。
下面还是举个例子来说明。
my.html
<!doctype html> <htmllang="en-us"> <!-- 省略... --> <body> document.querySelector('.mybutton').addEventListener('click', function(){ alert('检查控制台'); var result = Module.ccall('sum', // name of C function null, // return type null, // argument types null); // arguments }); </script> <scriptasynctype="text/javascript"src="hello3.js"></script> </body> </html>
里面引用了 hello3.js
并且使用 Module.ccall
调用了 C 函数 sum
。
hello.c
#include<stdio.h> #include<emscripten/emscripten.h> int main(int argc, char ** argv){ printf("Hello emcc\n"); } #ifdef__cplusplus extern "C" { #endif int EMSCRIPTEN_KEEPALIVE sum(){ printf("sum = %i\n", 100); return 1; } #ifdef__cplusplus } #endif
编译 hello.c
emcc -o hello.html hello.c -O3 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']"
注意: EXTRA_EXPORTED_RUNTIME_METHODS
设置了 Module 的导出函数,不导出 ccall
的话,会报以下错误:
'ccall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)
现在可以运行 my.html
emrun my.html
可以修改一下 sum 函数,使其带参数,修改如下:
#include<stdio.h> #include<emscripten/emscripten.h> int main(int argc, char ** argv){ printf("Hello World emcc\n"); } #ifdef__cplusplus extern "C" { #endif int EMSCRIPTEN_KEEPALIVE sum(int a, int b){ printf("sum = %i\n", (a+b)); return 1; } #ifdef__cplusplus } #endif
需要修改 my.html
文件,修改内容如下:
var result = Module.ccall('sum', // name of C function null, // return type ['number'], // argument types [12, 13]); // arguments
注意 argument types
和 arguments
的填写,运行可以看到预期效果。
扫码关注,你我就各多一个朋友~
以上所述就是小编给大家介绍的《Emscripten:JS 调用 C、C++》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 直观讲解-RPC调用和HTTP调用的区别
- 调用链系列一:解读UAVStack中的调用链技术
- 调用链系列二:解读UAVStack中的调用链技术
- 调用链系列三:解读UAVStack中的调用链技术
- dubbo源码解析(二十七)远程调用——injvm本地调用
- 微服务间的调用和应用内调用有什么区别
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解计算机系统(原书第3版)
Randal E.Bryant、David O'Hallaron / 龚奕利、贺莲 / 机械工业出版社 / 2016-11 / 139.00元
和第2版相比,本版内容上*大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础。主要更新如下: 基于x86-64,大量地重写代码,首次介绍对处理浮点数据的程序的机器级支持。 处理器体系结构修改为支持64位字和操作的设计。 引入更多的功能单元和更复杂的控制逻辑,使基于程序数据流表示的程序性能模型预测更加可靠。 扩充关于用GOT和PLT创建与位置无关代码的......一起来看看 《深入理解计算机系统(原书第3版)》 这本书的介绍吧!