Emscripten:JS 调用 C、C++

栏目: C++ · 发布时间: 5年前

内容简介:在了解 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

Emscripten:JS 调用 C、C++

可以修改一下 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 typesarguments 的填写,运行可以看到预期效果。

扫码关注,你我就各多一个朋友~

Emscripten:JS 调用 C、C++


以上所述就是小编给大家介绍的《Emscripten:JS 调用 C、C++》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

慕课革命

慕课革命

汤敏 / 中信出版社 / 2015-1-1 / 39.00元

《慕课革命》,国内唯一一本关于全方面了解慕课的权威著作,全面阐述慕课理念与中国实践。 林毅夫、俞敏洪、徐小平、王强作序推。 大规模在线教育的慕课革命大幕已经拉开,这是一场基于互联网及移动互联网的教育大变革。根据网易教育联合有道发起的《2013中国在线教育新趋势调查报告》揭示,中国在线教育正呈现出六大趋势,包括互联网成为人们获取知识的最常见渠道;移动端学习方式已经开始成为人们接受的学习方......一起来看看 《慕课革命》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具