`
zhhaogen
  • 浏览: 13545 次
  • 性别: 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++函数

    在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语言函数学习实例_

    函数的定义、声明和调用是C语言编程中不可或缺的部分。本篇将深入探讨这三个概念,以及如何处理参数传递,特别是数组作为函数参数的情况。 1. **函数的定义**: 函数定义是创建一个函数的过程,它包括函数名、返回...

    python调用C/C++ demo

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

    C语言实验二——函数.

    C语言实验二——函数 本实验旨在帮助学生熟悉C语言的函数编程,了解函数的定义、调用和应用。实验内容包括程序设计、程序填空和程序改错三个部分。 在程序设计部分,学生需要编写一个函数来计算并输出n(包括n)...

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

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

    qt调用c语言代码(c语言的代码写在c文件中)

    5. **在Qt代码中调用C函数**:现在,你可以像调用任何其他C++函数一样调用C语言函数了。确保在调用前正确包含了C函数的头文件。 ```cpp #include "cfunction.h" int main(int argc, char *argv[]) { QApplication...

    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`接收两个参数...

    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 文件。

    js调用c++函数,c++调用js函数(非mfc)

    C++编译成WebAssembly后,JavaScript可以使用`WebAssembly.instantiateStreaming`或`WebAssembly.instantiate`来加载和调用C++函数。 ```javascript fetch('your_module.wasm') .then(response =&gt; response....

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

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

    cpp-C语言中的高性能WebAssembly解释器

    在"cpp-C语言中的高性能WebAssembly解释器"项目中,我们关注的是如何利用C++的强大性能和灵活性来构建一个能够高效执行WebAssembly字节码的解释器。C++允许我们直接操作内存,使用模板元编程进行编译时优化,并且有...

    java语言方法调用C语言函数

    通过这个实例,我们了解了如何使用Java的JNI调用C语言函数的基本步骤:声明Java本地方法、生成C语言头文件、编写C代码、编译C代码为动态链接库,最后在Java中调用该库。这种方法在需要高效计算、底层系统交互或利用...

Global site tag (gtag.js) - Google Analytics