这是我的C代码:
// helloworld.c
#include <stdio.h>
#include <emscripten.h>
int* EMSCRIPTEN_KEEPALIVE getIntArray(){
static int numbers[] = {1, 2, 4, 8, 16};
return numbers;
}
这是我的一些JS:
// helloworld.html
let result = Module.ccall('getIntArray', // name of C function
'Uint8Array', // return type
[null], // argument types
[null]); // arguments
let array = new Uint8Array(result,5);
console.log(result); // prints 1024
console.log(array); // prints Uint8Array(1024) [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, … ]
所有这些都可以编译并正常运行。上面的代码适用于原始值,但是使用数组指针失败,并且我得到的JS类型数组全为零。我在文档中看到了其他一些解决方案,但是它们似乎也不适合我。
答案 0 :(得分:3)
您的getIntArray
函数将返回一个整数,该整数是WebAssembly模块线性内存中数组的位置。为了使用它,您将需要引用模块的线性存储器。
一种选择是在JavaScript端创建线性内存:
const imports = {
env: {
memoryBase: 0,
tableBase: 0,
memory: new WebAssembly.Memory({
initial: 512
}),
table: new WebAssembly.Table({
initial: 0,
element: 'anyfunc'
})
}
};
const instance = new WebAssembly.Instance(module, imports);
然后,您可以使用返回的结果(为整数)作为线性内存的偏移量:
const result = Module.ccall('getIntArray', // name of C function
'Uint8Array', // return type
[null], // argument types
[null]); // arguments
const data = new Uint8Array(imports.env.memory.buffer, result, 5);