再次 WebAssembly 技术探讨
上次说到你可以将C代码编译成web调用的js文件,当时,很兴奋。哈哈,我也误以为是系统级别的C编程呢!
哎,今天,告诉你一个残酷的事实是,只是C语言级别,不是系统级别。因为WebAssembly目标是跨平台,所以,怎么能有系统API掺和进来呢。当然,哪天等到各个系统厂商都把自己的系统调用揉进了WebAssembly的SDK库里时候,诸位就可以继续做梦了!哈哈哈。
今天,我们继续WebAssembly下源码C语言教程吧,这次要复杂些了。
除了基本类型,比如int, 那字符串呢?
嘿嘿,今天就来回答你。
*********************************************************************************************************************************
//call.c
#include <math.h>
#include <stdlib.h>
#include <string.h>
char *test1(char *instr)
{
char *array = malloc(sizeof(char)*(strlen(instr)+1));
strcpy(array,instr);
int size = strlen(array);
for(int n=0;n<size;n++)
{
if((array[n] >= 'a') && (array[n] <= 'z')) array[n] -= 'a'-'A';
}
return array;
}
int *test2(int *in,int size)
{
int *array = malloc(sizeof(int)*size);
for(int n=0;n<size;n++)
{
array[n] = in[n]*2;
}
return array;
}
//compiler
emcc call.c -o call.js -s EXPORTED_FUNCTIONS="['_test1','_test2']"
//HTML
<!DOCTYPE html>
<html>
<body>
<script src="call.js"></script>
<script>
function write_1d_int32_array(ptr,array)
{
for(i=0;i<array.length;i++)
{
Module.setValue(ptr,array[i],'i32');
ptr += 4;
}
}
function read_1d_int32_array(ptr,length)
{
var array = [];
for(i=0;i<length;i++)
{
var value = Module.getValue(ptr+(i*4),'i32');
array.push(value);
}
return array;
}
// test1 - a C function that takes, and returns a C style string (char *)
var mystring = "test";
var strptr = Module._malloc(mystring.length);
Module.writeAsciiToMemory(mystring, strptr);
var retstrptr = Module.ccall('test1', // name of C function
'number', // return type
['number'], // argument types
[strptr]); // arguments
// Convert the resulting string to a JS string
var retstr = Pointer_stringify(retstrptr);
document.write(retstr);
// test2 - a C function that takes, and returns a C style int array (int *)
var myarray = [10,20,30,40,50];
var arrayptr = Module._malloc(myarray.length*4);
write_1d_int32_array(arrayptr,myarray);
var retarrayptr = Module.ccall('test2', // name of C function
'number', // return type
['number'], // argument types
[arrayptr,myarray.length]); // arguments
// Convert the resulting pointer to a JS array
var retarray = read_1d_int32_array(retarrayptr,myarray.length);
document.write(retarray);
</script>
</body>
</html>
// 执行
将call.js, index.html 放置到tomcat服务器universal中,浏览器中输入
http://localhost:8080/universal/index.html
请看,如下就是你期待的结果

这个例程是国外大牛写的,我们在此向英雄致敬!
*********************************************************************
Finally:
不好意思,对WebAssembly的热情,我尽然TMD减低了。
我觉得还是继续Golang吧,好歹在linux下他能调用系统级的功能,也该着它是服务端的东西,哈哈哈
Windows上的兄弟姐妹们,你们去找它们闹去吧,不然没奶吃的啦!哈哈哈
再会!
再次 WebAssembly 技术探讨的更多相关文章
- 暴力破解FTP服务器技术探讨与防范措施
暴力破解FTP服务器技术探讨与防范措施 随着Internet的发展出现了由于大量傻瓜化黑客工具任何一种黑客攻击手段的门槛都降低了很多但是暴力破解法的工具制作都已经非常容易大家通常会认为暴力破解攻击只是 ...
- Oracle数据库容灾备份技术探讨
Oracle数据库容灾备份技术探讨 三种Oracle灾备技术 对于Oracle数据库的灾备技术,我们可以从Data Guard,GoldenGate和CDP角度去考虑. Oracle Data Gua ...
- 新华三孟丹:NFV资源池实现中的技术探讨
近日,在第三届未来网络发展大会SDN/NFV技术与应用创新分论坛上,新华三解决方案部架构师孟丹女士发表了主题为<NFV资源池实现中的技术探讨>的主题演讲. 孟丹指出,新华三的NFV核心理念 ...
- 七雄Q传封包辅助技术探讨回忆贴
前言 网页游戏2013年左右最火的类型最烧钱游戏,当年的我也掉坑了.为了边玩还满足码农精神我奋力的学习如何来做外挂.2013年我工作的第二个年头.多一半…介绍下游戏<七雄Q传>是北京游戏谷 ...
- 关于IPA文件重签名后如何跟踪管理APP的技术探讨和实践演示
前言:开发iOS的朋友都知道,在功能开发完成后,我们就会用申请的苹果账号在后台做证书配置,然后提交到AppStore,但是也有部分APP我们不需要提交到AppStore,比如内部测试用的APP.定制给 ...
- 微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术
字节码联盟 (Bytecode Alliance)宣布已正式成为 501(c)(3) 非营利组织,参与组建的企业/组织包括 Fastly.英特尔.Mozilla 和微软,此外还邀请到了 Arm.DFI ...
- 安卓Dex壳技术探讨(1)
最近在研究安卓平台的加壳技术,以前以为只有原生层的代码才可以加壳,看了看网上的资料,才发现原来Java层也可以加壳,虽然与传统的壳有些区别,但就最终的效果来说,反静态分析的目的还是达到了的. 目前安卓 ...
- 抽奖随机算法的技术探讨与C#实现
一.模拟客户需求 1.1 客户A需求:要求每次都按照下图的概率随机,数量不限,每个用户只能抽一次,抽奖结果的分布与抽奖概率近似. 1.2 客户B需求:固定奖项10个,抽奖次数不限,每个用户只能抽一次, ...
- Java实现二维码技术探讨。
Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.j ...
随机推荐
- Echarts Map 值域为小数的原因
最近做一个项目用到了Echarts Map不知道怎么回事,有时多了一位小时,可这个意义不用小数表示(1.0个人似乎觉得有点奇怪嘞 {boolean}calculable false 是否启用值域漫游, ...
- MPD软件工作坊上海站本周末在上海举行
本周末(5月26日至27日)由麦思博(msup)主办的第39届MPD软件工作坊即将在上海虹桥会议中心举行.本届MPD将继续围绕软件研发领域,邀请了21位技术大咖,从产品运营.团队管理.架构技术.自动化 ...
- Win10正式版U盘安装教程
1.首先我们需要登陆“微软中国下载中心”,从中下载一款名为“MediaCreationTool”的工具,利用该工具可以制作Win10安装U盘.直接通过以下地址快速进入“Windows下载中心”,根据自 ...
- python的代码缩进和冒号
一般语言一样采用{}或者begin...end分隔代码块,而是python中,采用代码缩进和冒号来区分代码之间的层次. 缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严 ...
- 用SignalTap进行硬件仿真
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- go install and go captcha
https://blog.csdn.net/liuhongwei123888/article/details/8512815 [gocaptcha] http://www.cnblogs.co ...
- PHP进阶-网络编程基础概念
以太网协议图: 以太网协议: 发送header(发送至mac地址,接收者mac地址).data到网线中所有连接的计算机,然后每个机子接收数据包的时候都是用以太网协议的, 然后解析header头,看是否 ...
- Calcite - StreamingSQL
https://calcite.apache.org/docs/stream.html Calcite's SQL is an extension to standard SQL, not ano ...
- mysql学习【第3篇】:使用DQL查询数据
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第3篇]:使用DQL查询数据 DQL语言 DQL( Data Query Lan ...
- SQL join的介绍
学员表 SELECT * FROM tb_address; SELECT * FROM tb_student 1.JOIN关联两个表数据,将匹配数据展示,数据无匹配值则不展示 注释:INNER JOI ...