对于WebAssembly编译出来的.wasm文件js如何调用

WebAssembly也叫浏览器字节码技术 这里就不过多的解释了网上很多介绍

主要是让大家知道在js里面如何调用执行它,我之前看WebAssemblyAPI时候反正是看得一脸懵逼

也是为了大家能更快的入手这个比较新的技术吧

这边写的一个dom是官方推荐的c/c++编译的

c代码

1 int add (int x, int y) {
2   return x + y;
3 }
4
5 int square (int x) {
6   return x * x;
7 }

属性c但是对字节码不熟悉的朋友可能会不理解,为什么没有main函数

这里主要是把这个c代码当成一个模块调用不需要它自己执行所以没有,官方也有有main函数的能直接生成js和html但是太过雍于,

这种方式比较推荐,也是让js能直接调用比较方便

之后使用 emscripten进行编译  emcc math.c -Os -s WASM=1 -s SIDE_MODULE=1 -o math.wasm

然后就有math.wasm文件了,如果没装emscripten的话我博客里面有一篇是关于安装的

有了math.wasm文件后就该用js调用它了

新建math.html加入调用的方法如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>Document</title>
 8 </head>
 9 <body>
10     <h1>
11
12     </h1>
13     <script>
14     /**
15  * @param {String} path wasm 文件路径
16  * @param {Object} imports 传递到 wasm 代码中的变量
17  */
18         function loadWebAssembly (path, imports = {}) {
19           return fetch(path) // 加载文件
20             .then(response => response.arrayBuffer()) // 转成 ArrayBuffer
21             .then(buffer => WebAssembly.compile(buffer))
22             .then(module => {
23               imports.env = imports.env || {}
24
25               // 开辟内存空间
26               imports.env.memoryBase = imports.env.memoryBase || 0
27               if (!imports.env.memory) {
28                 imports.env.memory = new WebAssembly.Memory({ initial: 256 })
29               }
30
31               // 创建变量映射表
32               imports.env.tableBase = imports.env.tableBase || 0
33               if (!imports.env.table) {
34                 // 在 MVP 版本中 element 只能是 "anyfunc"
35                 imports.env.table = new WebAssembly.Table({ initial: 0, element: ‘anyfunc‘ })
36               }
37
38               // 创建 WebAssembly 实例
39               return new WebAssembly.Instance(module, imports)
40             })
41         }
42         //调用
43         loadWebAssembly(‘./math.wasm‘)
44         .then(instance => {
45             const add = instance.exports._add//取出c里面的方法
46             const square = instance.exports._square//取出c里面的方法
47
48             console.log(‘10 + 20 =‘, add(10, 20))
49             console.log(‘3*3 =‘, square(3))
50             console.log(‘(2 + 5)*2 =‘, square(add(2 + 5)))
51         })
52
53     </script>
54 </body>
55 </html>

我这里的路径math.html和math.wasm是同级的

现在就可以打开浏览器查看了 但是fetch方法在本地是不能使用的它是网络请求 所有这里需要来个web服务器

打开终端之间键入 npm install -g serve

下载web服务器

然后server . 启动

有点的 .

启动完成效果:

然后通过web服务器访问就能看到调用c方法后的计算结果:

原文地址:https://www.cnblogs.com/y-y-y-y/p/9897154.html

时间: 2025-01-18 00:14:42

对于WebAssembly编译出来的.wasm文件js如何调用的相关文章

Cocos2d-x移植到Android平台编译的两个文件Android.mk和Application.mk

背景 首先,说说文章的背景.最近手中的一个项目,由于需求中要求提供Web界面的打印功能,当然如果没有打印机,还可以提供保存到本地.项目组长把这个"小任务"分给了我.本着努力为组长分忧解难的思想,领了任务之后,就马上开始了工作. 问题 刚开始的时候,组长给了一个工具(jatoolsprinter)让我研究,我用了一个多小时的时间,做出了一个简单的Demo,然后就是各种的测试,由于 web 打印需要浏览器安装 ActiveX 组件,在随后的测试中,我用了几款浏览器,甚至把安全级别都调到了最

Xcode编译WebApps找不到js的错误解决办法&lt;转&gt;

使用Xcode做WebApps时,使用UIWebview来调用一个页面,有时会遇到问题,其一就是编译的时候出现黄色感叹号的Warning,js文件都报错:warning: no rule to process file '$(PROJECT_DIR)/jquery-1.8.1.min.js' of type sourcecode.javascript for architecture i386 错误原因是:js和html等资源文件加入到project的时候,Xcode错误的将js文件都放到了编译

WebView使用详解(一)——Native与JS相互调用(附JadX反编译)

前言:念念不忘,必有回响,永远坚持你所坚持的! 一直在用WebView,还没有系统的总结过它的用法,下面就系统的总结下,分享给大家 一.基本用法 1.加载在线URL void loadUrl(String url) 这个函数主要加载url所对应的网页地址,或者用于调用网页中的指定的JS方法(调用js方法的用法,后面会讲),但有一点必须注意的是:loadUrl()必须在主线程中执行!!!否则就会报错!!!.注意:加载在线网页地址是会用到联网permission权限的,所以需要在AndroidMan

译:Grunt编译sass&amp;compass和压缩js的工作流程

原文:Grunt workflow for compiling Sass & Compass and minifying Javascript 以前,我们安装Node,NPM和Grunt还包括建立的一个package.json文件和一个Gruntfile文件.在这篇让人兴奋的文章中,我们将会填补一切,你会领会到Grunt是多么的让人吃惊,体验一下他让人敬畏的力量,就像慵懒的沐浴在温暖的阳光下一样让人满意. 如果你还没有安装Node,NPM和Grunt 那就需要先安装好这些东西(真的不难也不可怕)

Gulp-自动化编译sass和pug文件

突然发现在我博客文章中,缺少这一块的记录,那我就补一篇吧. gulp的环境配置和安装:http://www.cnblogs.com/padding1015/p/7162024.html 这里就补充一篇gulpfile.js的配置,用于自动化编译sass和pug文件用: 1 var gulp = require('gulp'); 2 var pug = require('gulp-pug'); 3 var sass = require('gulp-sass'); 4 var rename = re

加载依赖的jar包在命令行编译和运行java文件

在命令里编译和执行java文件,当应用程序需要需要依赖的jar包里面的class文件才能编译运行的时候,应该这样做: 1. 首先是编译过程,在命令行里面执行: (1) javac -classpath ClassPath Test.java    //其中ClassPath对应的是jar包的路径,这个jar包亦可以是zip包 (2) javac -classpath CLASSPATH:*.jar Test.java    //其中ClassPath对应的是jar包的路径,这个jar包亦可以是z

(转载)反编译android的apk文件步骤

下面的方法我已经尝试过,完全可以成功,重点的步骤我在这里说一下 1.必须要有java环境,记得配置好环境变量 2.如果只查看class中的函数文件,只需要下载dex2jar和jd-gui 3.下载地址 dex2jar:http://code.google.com/p/dex2jar/downloads/list jd-gui:http://dl.iteye.com/topics/download/b99d0351-87d8-3ed1-a875-441e0eea0ce4 相信很多开发者都知道反编译

VS编译好的*.lib文件,在其他版本上不能使用出现以下错误

解决方法,有源代码则用本地VS编译器编译生成新的lib文件,在调用:没有源代码,则需知道改lib文件编译时的VS版本,用新的VS版本进行编译

VS2005,VS2008,VS2010将ASP.NET网站编译成一个DLL文件

分类: C#/ASP.Net 2012-10-09 22:19 1342人阅读 评论(1) 收藏 举报 dllasp.net2010deploymentwebsiteassembly VS在发布网站时,bin目录里为所有cs生成的dll文件每次都是随机命名的,如:App_Web_xxxxxxxx.dll(xxxxxxx是 8个小写的字母和数字组成的字符串,随机的),这样对更新 Live 站点很不方便,因为动态库名变了,涉及到每一个 aspx 文件每次都重新更改了对库的引用声明: