上次说到你可以将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 技术探讨的更多相关文章

  1. 暴力破解FTP服务器技术探讨与防范措施

    暴力破解FTP服务器技术探讨与防范措施 随着Internet的发展出现了由于大量傻瓜化黑客工具任何一种黑客攻击手段的门槛都降低了很多但是暴力破解法的工具制作都已经非常容易大家通常会认为暴力破解攻击只是 ...

  2. Oracle数据库容灾备份技术探讨

    Oracle数据库容灾备份技术探讨 三种Oracle灾备技术 对于Oracle数据库的灾备技术,我们可以从Data Guard,GoldenGate和CDP角度去考虑. Oracle Data Gua ...

  3. 新华三孟丹:NFV资源池实现中的技术探讨

    近日,在第三届未来网络发展大会SDN/NFV技术与应用创新分论坛上,新华三解决方案部架构师孟丹女士发表了主题为<NFV资源池实现中的技术探讨>的主题演讲. 孟丹指出,新华三的NFV核心理念 ...

  4. 七雄Q传封包辅助技术探讨回忆贴

    前言 网页游戏2013年左右最火的类型最烧钱游戏,当年的我也掉坑了.为了边玩还满足码农精神我奋力的学习如何来做外挂.2013年我工作的第二个年头.多一半…介绍下游戏<七雄Q传>是北京游戏谷 ...

  5. 关于IPA文件重签名后如何跟踪管理APP的技术探讨和实践演示

    前言:开发iOS的朋友都知道,在功能开发完成后,我们就会用申请的苹果账号在后台做证书配置,然后提交到AppStore,但是也有部分APP我们不需要提交到AppStore,比如内部测试用的APP.定制给 ...

  6. 微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术

    字节码联盟 (Bytecode Alliance)宣布已正式成为 501(c)(3) 非营利组织,参与组建的企业/组织包括 Fastly.英特尔.Mozilla 和微软,此外还邀请到了 Arm.DFI ...

  7. 安卓Dex壳技术探讨(1)

    最近在研究安卓平台的加壳技术,以前以为只有原生层的代码才可以加壳,看了看网上的资料,才发现原来Java层也可以加壳,虽然与传统的壳有些区别,但就最终的效果来说,反静态分析的目的还是达到了的. 目前安卓 ...

  8. 抽奖随机算法的技术探讨与C#实现

    一.模拟客户需求 1.1 客户A需求:要求每次都按照下图的概率随机,数量不限,每个用户只能抽一次,抽奖结果的分布与抽奖概率近似. 1.2 客户B需求:固定奖项10个,抽奖次数不限,每个用户只能抽一次, ...

  9. Java实现二维码技术探讨。

    Java生成二维码方法有三种: 1: 使用SwetakeQRCode在Java项目中生成二维码  http://swetake.com/qr/ 下载地址  或着http://sourceforge.j ...

随机推荐

  1. 3-idiots hdu4609 母函数+FFT 组合数学题

    http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:1e5个数,求取三个数能形成三角形的概率. 题解(这怎么会是fft入门题QAQ): 概率的算法就是三 ...

  2. 相对定位和绝对定位 left和margin-left

    1.直接在css中设置left生效的前提是必须设置父容器position:absolute或relative,如果不设置则会以最近一个定位的父对象为参考点,.margin-left则不用设positi ...

  3. c#加"\n\r"不换行,变成字符串

    质检模块,本想将每个错误分行, 比如:lyrerrormess += lyrname + "图层" + "缺少" + xmlFieldName + " ...

  4. Spring Boot引起的“堆外内存泄漏”排查及经验总结

    小结: 检索词:C++内存分配器.jvm内存模型.gdb.内存泄露 https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak ...

  5. 转:手把手教你如何玩转Solr(包含项目实战)

    原文地址:手把手教你如何玩转Solr(包含项目实战) 参考原文

  6. LeetCode 893 Groups of Special-Equivalent Strings 解题报告

    题目要求 You are given an array A of strings. Two strings S and T are special-equivalent if after any nu ...

  7. js如何判断哪个按钮被点击了?

    用事件委托,然后判断target,代码如下: $(docuement).on('click',function(event){ event.target... }) 例如:点击.c1之外任意地方的时候 ...

  8. python中dict的fromkeys用法

    fromkeys是创造一个新的字典.就是事先造好一个空字典和一个列表,fromkeys会接收两个参数,第一个参数为从外部传入的可迭代对象,会将循环取出元素作为字典的key值,另外一个参数是字典的val ...

  9. git 码云的常用命令(版本控制)

    首先在码云仓库创建对应的仓库 当你输入错误用户名和密码 需要清掉配置 git config --system --unset credential.helper 设置账号 git config --g ...

  10. linux测试环境维护之磁盘空间维护

    常见需要定期清理的日志有: 清理oracle监听日志: 1.进入/opt/oracle/db/diag/tnslsnr/sels-186/listener/alert目录下, 执行命令: rm -rf ...