上次说到你可以将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上的兄弟姐妹们,你们去找它们闹去吧,不然没奶吃的啦!哈哈哈
再会!