`
zhhaogen
  • 浏览: 13414 次
  • 性别: Icon_minigender_1
  • 来自: 未知
社区版块
存档分类
最新评论

js调用c/cpp函数——WebAssembly入门

 
阅读更多

1.环境




 

参考网站:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly

http://kripken.github.io/emscripten-site/

 

2.WebAssembly简介

WebAssembly是实验性代码,为.wasm后缀二进制文件,可以通过emcc将c/cpp编译成wasm文件,再通过WebAssembly.instantiate(bufferSource, importObject) 实现cpp与js的交互。

 

3.编写c/cpp文件

将cpp函数导出,其中一种方式是extern "C" {}包围

main.cpp 实现js调用cpp的随机函数生成器

 

#include<stdio.h>
#include <random>
#include <iostream>
#include <atomic>
#include <math.h>
using namespace std;  

extern "C" {
mt19937  engine;
void setSeed(long seed)
{
	engine.seed(seed);
}

double mtrandom() {
	double min = 0.0;
	double max = 1.0;
	uniform_real_distribution<double> distribution(min, max);
	double d = distribution(engine); 
	return d;
}

}

 

 

4.编译

使用emcc可以编译成纯js模式,或者wasm格式,这里编译出wasm文件

 

emcc main.cpp -o index.html -s EXPORTED_FUNCTIONS="['_setSeed','_mtrandom']" -s WASM=1

 EXPORTED_FUNCTIONS 指定导出函数,WASM指定生成wasm格式

 

5.编写script调用cpp函数

index.html

<!doctype html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>js调用cpp函数例子</title>
  </head>
  <body>  
	种子:<input id="seedInput" type="number" value="123456" /><br> 
	数量:<input id="numInput" type="number" value="20" /><br> 
	<button onclick="run1()" >cwrap调用</button><button onclick="run2()" >直接调用</button>
	<div id="log">
	</div>
    <script type='text/javascript'>   
	  function run1()
	  {
		var fun1=Module.cwrap('setSeed');
		var fun2=Module.cwrap('mtrandom');
		var seed=parseInt(seedInput.value);
		var num=parseInt(numInput.value);
		fun1(seed);
		log.innerHTML="";
		for(var i=0;i<num;i++)
		{
			log.innerHTML+=fun2()+"<br>";
		}
	  }
	  function run2()
	  { 
		var seed=parseInt(seedInput.value);
		var num=parseInt(numInput.value);
		_setSeed(seed);//全局函数
		log.innerHTML="";
		for(var i=0;i<num;i++)
		{
			log.innerHTML+=_mtrandom()+"<br>";
		}
	  }
    </script>
    <script async type="text/javascript" src="index.js"></script>
  </body>
</html>

 

 js调用cpp方法,一可以使用cwarp方法,二可以使用下划线_加cpp函数名

 

6.输出结果



 

  • 大小: 57.4 KB
  • 大小: 48.8 KB
  • 大小: 19.9 KB
  • ccall.7z (34.1 KB)
  • 描述: WebAssembly入门例子源码
  • 下载次数: 5
分享到:
评论

相关推荐

    Lua与C/C++交互——C/C++调用Lua脚本

    通过`lua_register()`或`lua_pushcfunction()`,你可以将C函数绑定到Lua全局环境的一个名字上,使得Lua可以像调用其他 Lua 函数一样调用它们。 8. **错误处理** Lua API 提供了 `lua_error()` 函数用于抛出错误,...

    lua调用C/C++函数

    在Lua中调用C或C++函数是通过Lua的C API来实现的,这使得我们可以利用C/C++的高性能特性,同时保留Lua的易读性和灵活性。下面我们将详细探讨如何在Lua-5.2.3版本中进行这样的调用。 首先,了解Lua的C API是关键。...

    C/C++/Linux函数函数插桩(打桩)指南

    在C/C++编程中,插桩可以通过创建包装函数来实现,包装函数会在调用原始目标函数前后执行额外的代码。例如,当调用第三方动态库中的函数时,可以在包装函数中添加输入参数验证、性能统计等功能。 1.1 什么是插桩? ...

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    WebAssembly基础编程.pdf

    Emscripten工具链还提供了对C/C++导出函数进行封装的能力,这使得JavaScript代码能够直接调用C/C++代码中导出的函数。这是通过Emscripten生成的胶水代码实现的,胶水代码起到了桥接JavaScript和WebAssembly的作用。 ...

    C/C++ 函数指针的意义,函数指针的用法

    这里,`fp(5)`是C++风格的函数调用,而`(*fp)(10)`则是C风格的调用,两者等价,但体现了不同语言风格的兼容性。 #### 4. 函数指针的类型定义 为了简化函数指针的定义和使用,可以采用`typedef`关键字来创建函数...

    WebAssembly标准入门1

    【WebAssembly标准入门1】 WebAssembly(简称WASM)是一种新兴的、被广泛接受的网页虚拟机标准,旨在提供高可移植性、高安全性以及高效性能(包括快速加载和执行)。这种技术允许开发者将编译后的代码运行在浏览器...

    python调用C/C++ demo

    解决方法是在C++代码中使用`extern "C"`来声明函数,就像在C语言示例中那样。或者,你可以使用SWIG(Simplified Wrapper and Interface Generator)工具自动生成Python绑定。不过,对于简单的函数,直接使用`extern ...

    基于webassembly技术调用c/c++实现网页解码h264,并进行播放

    【作品名称】:基于webassembly技术调用c/c++实现网页解码h264,并进行播放. 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目...

    JniDemo Android调用C语言

    例如,`MainActivity.java`文件可能包含了调用C函数的Java代码,`src/main/cpp`目录下则有C/C++源文件,`CMakeLists.txt`负责构建C/C++代码。通过学习和分析这个项目,开发者可以深入了解如何在Android应用中使用JNI...

    Matlab调用C语言程序简单实例

    在这个例子中,作者编写了一个简单的C语言程序——`fact.c`,用于计算阶乘。这个程序的核心是`mexFunction`,这是一个特殊的C语言函数,它是MATLAB与C语言交互的入口点。 在`fact.c`中,`mexFunction`接收两个参数...

    c语言入门学习代码——黄果树

    在"自己的c语言入门代码实例"中,可能会包含对函数的使用,如函数的定义、调用,以及参数传递等。 再者,指针是C语言的一大特色,它允许我们直接操作内存。指针变量存储的是其他变量的地址,可以用来提高程序效率,...

    Demo: c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL

    只需确保C++函数声明遵循C语言的命名约定(通常是extern "C"),并且C语言的DLL导出函数不使用C++特有的特性,如类、模板或异常。 4. **C#调用C/C++ DLL**:C#可以通过.NET Framework的P/Invoke(Platform Invoke)...

    C++调用C函数实例详解

    调用C语言的函数,需要在函数声明的地方语句extern “C”。如果不使用该语句,在链接的时候,编译器就会报以下这种错误。 Test.obj : error LNK2019: 无法解析的外部符号 “void __cdecl DeleteStack(struct _Node *...

    C生成静态库给C++调用出现undefined reference to ...解决方案_cpp

    C++兼容C语言,这意味着C++程序可以调用C编写的函数。然而,由于C++支持命名空间和类等特性,因此在C++中调用C代码时需要遵循特定规则: - 使用`extern "C"`:为了让C++编译器知道某些函数是按照C语言的规则进行...

    JS调用DLL实例2

    JS 调用 DLL 实例详解 在 Unity3D 游戏引擎中,JS ...本文详细介绍了 JS 调用 DLL 实例的实现过程,包括导入外部 DLL、定义外部函数、调用外部函数等步骤。只要按照本文的步骤,开发者可以轻松地调用外部的 DLL 文件。

    C/C++ 函数指针教程

    ### C/C++函数指针教程 #### 一、函数指针简介 函数指针是C/C++编程语言中一个非常强大的特性,它允许程序将函数作为参数传递或从函数返回,从而实现高度灵活的编程模式。函数指针可以极大地提高代码的可重用性和...

    C语言库函数大全————最全的

    C语言库函数是C编程中的重要组成部分,它们提供了一系列预定义的功能,可以帮助程序员高效地完成各种任务。在本文中,我们将深入探讨几个重要的C语言库函数。 首先,`abort()`函数是一个用于异常终止进程的函数。当...

Global site tag (gtag.js) - Google Analytics