Skip to content

Instantly share code, notes, and snippets.

@jonathanlurie
Last active May 31, 2023 10:22
Show Gist options
  • Save jonathanlurie/e4aaa37e2d9c317ce44eae5f6011495d to your computer and use it in GitHub Desktop.
Save jonathanlurie/e4aaa37e2d9c317ce44eae5f6011495d to your computer and use it in GitHub Desktop.
Emscripten and float arrays
#include <math.h>
// otherwise C++ function names are mangled
extern "C" {
int float_multiply_array(float factor, float *arr, int length) {
for (int i = 0; i < length; i++) {
arr[i] = factor * arr[i];
}
return 0;
}
}
<!doctype html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Emscripten-Generated Code</title>
<script type="text/javascript" src="arrayFunction.js"></script>
</head>
<body>
<script>
// Import function from Emscripten generated file
float_multiply_array = Module.cwrap(
'float_multiply_array', 'number', ['number', 'number', 'number']
);
// Create example data to test float_multiply_array
var data = new Float32Array([1, 2, 3, 4, 5]);
// Get data byte size, allocate memory on Emscripten heap, and get pointer
var nDataBytes = data.length * data.BYTES_PER_ELEMENT;
var dataPtr = Module._malloc(nDataBytes);
// Copy data to Emscripten heap (directly accessed from Module.HEAPU8)
var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes);
dataHeap.set(new Uint8Array(data.buffer));
// Call function and get result
float_multiply_array(20, dataHeap.byteOffset, data.length);
var result = new Float32Array(dataHeap.buffer, dataHeap.byteOffset, data.length);
// Free memory
Module._free(dataHeap.byteOffset);
console.log( result );
</script>
</body>
</html>
emcc -O3 arrayFunction.cpp -o arrayFunction.js -s EXPORTED_FUNCTIONS="['_float_multiply_array']"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment