我希望测试WebAssembly以进行一些复杂的数组计算。
因此,我编写了一个简单的C++函数,用于添加两个包含3个元素的int
数组:
// hello.cpp
extern "C" {
void array_add(int * summed, int* a, int* b) {
for (int i=0; i < 3; i++) {
summed[i] = a[i] + b[i];
}
}
}
并使用以下命令进行编译:
emcc hello.cpp -s WASM=1 -s "MODULARIZE=1" -s "EXPORT_NAME='HELLO'" -s "BINARYEN_METHOD='native-wasm'" -s "EXPORTED_FUNCTIONS=['_array_add']" -o build/hello.js
其中生成了一个js
文件和一个wasm
文件。我使用以下HTML页面加载它们:
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="build/hello.js"></script>
<script type="text/javascript">
function reqListener () {
// Loading wasm module
var arrayBuffer = oReq.response
HELLO['wasmBinary'] = arrayBuffer
hello = HELLO({ wasmBinary: HELLO.wasmBinary })
// Calling function
var result = new Int32Array(3)
var a = new Int32Array([1, 2, 3])
var b = new Int32Array([4, 5, 2])
hello._array_add(result, a, b)
console.log('result', result)
}
var oReq = new XMLHttpRequest();
oReq.responseType = "arraybuffer";
oReq.addEventListener("load", reqListener);
oReq.open("GET", "build/hello.wasm");
oReq.send();
</script>
</head>
<body>
</body>
</html>
但不知为何,result
数组总是 [0, 0, 0]
。
我尝试了各种方法,包括使用 ccall()
调用函数(请参见 emscripten 文档),似乎无法将数组作为参数传递给 wasm 编译的函数。
例如,使用下面的 C++ 函数:
extern "C" {
int first(int * arr) {
return arr[0];
}
}
当在JavaScript中调用时,返回的结果是一个近似随机的整数,而不是我作为参数传递的数组中预期的值。我错过了什么?
注意:我对C ++几乎一无所知,因此如果这是与我的C ++无知有关的初学者问题,则表示歉意。