Emscripten - 如何从 C 到 JavaScript 获取 uint8_t 数组?
Emscripten - How to get uint8_t array from C to JavaScript?
我在 C 中有一个 uint8_t 数组类型。名为 getResultArray 的函数将 return 这个数组。如何在 JavaScript 中获取此数组?
uint8_t * getResultBuffer() { return resultBuffer }
从 C 函数返回的指针是 Emscripten 用来表示内存的 ArrayBuffer 的偏移量。要查看为 uint8_t,请使用 Module.HEAPU8
.
访问内存
这里有一个例子,使用 em++:
fill_array.cpp:
#include "stdint.h"
extern "C" {
uint8_t* fill_array(int n);
}
uint8_t* fill_array(int n) {
uint8_t* arr = new uint8_t[n];
for(uint8_t i=0;i<n;++i)
arr[i] = i;
return arr;
}
index.html:
<!doctype html>
<html>
<body>
<script>
var Module = {
onRuntimeInitialized: function() {
var fill_array = Module.cwrap('fill_array', 'number', [])
var n = 16;
var ptr_from_wasm = fill_array(n);
var js_array = Module.HEAPU8.subarray(ptr_from_wasm, ptr_from_wasm + n);
alert(js_array);
},
};
</script>
<script async type="text/javascript" src="index.js"></script>
</body>
</html>
结果如下:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
为此,您需要将以下参数添加到 em++:
-s EXPORTED_FUNCTIONS='["_fill_array"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'
请参阅 This repo
中的完整源代码
我在 C 中有一个 uint8_t 数组类型。名为 getResultArray 的函数将 return 这个数组。如何在 JavaScript 中获取此数组?
uint8_t * getResultBuffer() { return resultBuffer }
从 C 函数返回的指针是 Emscripten 用来表示内存的 ArrayBuffer 的偏移量。要查看为 uint8_t,请使用 Module.HEAPU8
.
这里有一个例子,使用 em++:
fill_array.cpp:
#include "stdint.h"
extern "C" {
uint8_t* fill_array(int n);
}
uint8_t* fill_array(int n) {
uint8_t* arr = new uint8_t[n];
for(uint8_t i=0;i<n;++i)
arr[i] = i;
return arr;
}
index.html:
<!doctype html>
<html>
<body>
<script>
var Module = {
onRuntimeInitialized: function() {
var fill_array = Module.cwrap('fill_array', 'number', [])
var n = 16;
var ptr_from_wasm = fill_array(n);
var js_array = Module.HEAPU8.subarray(ptr_from_wasm, ptr_from_wasm + n);
alert(js_array);
},
};
</script>
<script async type="text/javascript" src="index.js"></script>
</body>
</html>
结果如下:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
为此,您需要将以下参数添加到 em++:
-s EXPORTED_FUNCTIONS='["_fill_array"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'
请参阅 This repo
中的完整源代码