美文网首页JAVA
WebAssembly之使用JS调用C/C++接口

WebAssembly之使用JS调用C/C++接口

作者: Lee_5566 | 来源:发表于2020-09-08 16:48 被阅读0次
image.png

如果想在C/C++代码中定义一个需要从JavaScript调用的函数,可以使用Emscripten 的ccall()函数并使用EMSCRIPTEN_KEEPALIVE声明(它将添加函数到导出函数列表)来完成。

代码创建

创建一个test.c文件:

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

int main(int argc, char ** argv)
{
    printf("Hello World\n");
}

#ifdef __cplusplus
extern "C"
{
#endif

void EMSCRIPTEN_KEEPALIVE add(int a, int b)
{
    printf("a+b=%d\n", a+b);
}

#ifdef __cplusplus
}
#endif

默认情况下,Emscripten生成的代码总是只调用该main()函数,其他函数作为死代码被删除。

将EMSCRIPTEN_KEEPALIVE放在函数名称之前可以阻止这种情况发生。
还需要导入emscripten.h库来使用EMSCRIPTEN_KEEPALIVE。

添加模板文件HTML

在上一级新建html_template目录,并将shell_minimal.html复制到目录中。

其余步骤和上一章节相同。

运行实例

执行编译:

 emcc -o test.html test.c -O3 -s WASM=1 --shell-file ../html_template/shell_minimal.html -s NO_EXIT_RUNTIME=1  -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']"

编译成功后执:

 emrun --no_browser --port 8080 .
image.png

在浏览器中执行:http://127.0.0.1:8080/
进入test.html:


image.png

但是并没有调用我们的函数,下面就要修改html文件调用我们的函数。

在html文件中添加按钮和对应的回调函数:

<button class="mybutton">Run myFunction</button>
document.querySelector('.mybutton')
    .addEventListener('click', function(){
        alert('check console');
        var result = Module.ccall(
            'add',
            null,
            ['number', 'number'],
            [13, 40]
        );
    })
image.png

ccall函数语法解释:

var result = Module.ccall(ident, returnType, argTypes, args);

参数:

  • ident :C导出函数的函数名(不含“_”下划线前缀);
  • returnType :C导出函数的返回值类型,可以为'boolean'、'number'、'string'、'null',分别表示函数返回值为布尔值、数值、字符串、无返回值;
  • argTypes :C导出函数的参数类型的数组。参数类型可以为'number'、'string'、'array',分别代表数值、字符串、数组;
  • args :参数数组。
    使用例子:
var result = Module.ccall('add', 'number', ['number', 'number'], [13.0, 42]);

执行的效果:


image.png

相关文章

  • WebAssembly之使用JS调用C/C++接口

    如果想在C/C++代码中定义一个需要从JavaScript调用的函数,可以使用Emscripten 的ccall(...

  • 异步

    WebAssembly C++ 阻塞调用JS异步函数[https://zhuanlan.zhihu.com/p/4...

  • C++调用lua方式

    目标 使用C++调用lua接口 示例 lua代码(test.lua) C++调用示例(lua_test.cpp) ...

  • 「转」C++ 和 JS 交互

    本章主要来讲讲如何通过 V8 来实现 JS 调用 C++。JS 调用 C++,分为 JS 调用 C++ 函数(全局...

  • CINTERFACE 宏的作用

    CINTERFACE宏用于在c++项目中使用c风格(规范)的COM 接口调用。

  • Go调用C/C++

    cgo golang是类C的语言 支持调用C接口(不支持调用C++)Go调用C/C++的方式 : C : 直接调用...

  • 各种加密算法编程演示实验

    实验目的 掌握各种对称算法接口的调用方法(C/C++方式) 掌握各种非对称算法接口的调用方法(C/C++方式) 掌...

  • WebAssembly wa实战

    WebAssembly wa实战 在前端使用wa调用c、go等语言 一般可以使用js多进程,在一个进程计算,然后...

  • node 底层要了解的内容

    1.js源码 , console.log 等应用相关 ,以及调用c++方面的接口2.c++源码 http请求 I/...

  • C/C++与Java之间的互相调用

    利用JNI技术,可以做到C/C++与Java之间的相互调用。 1、Java调用C/C++接口 一般把C/C++写成...

网友评论

    本文标题:WebAssembly之使用JS调用C/C++接口

    本文链接:https://www.haomeiwen.com/subject/taqjektx.html