Esto es lo que he recogido de varios puestos y mirando emscripten código incluido:
En C++:
#include <iostream>
#include <functional>
extern "C" {
void registerCallback(void(*back)(const char*));
void triggerCallback(char* message); // for invoking it from JS, just for this example
}
// global
std::function<void(const char*)> gCallback;
void registerCallback(void(*back)(const char*)){
gCallback = back;
}
void triggerCallback(char* message){
if (gCallback) {
gCallback(message);
} else {
std::cerr << "Cannot pass '"<< message <<"' to undefined callback\n";
}
}
Una cosa importante, que faltaba en otras críticas, es compilar C++ con RESERVED_FUNCTION_POINTERS = ... bandera, por ejemplo:
em++ -std=c++11 -s RESERVED_FUNCTION_POINTERS=20 source.cpp -s EXPORTED_FUNCTIONS="['_registerCallback','_triggerCallback']" -o try.html
Después try.html carga en un navegador, se puede ejecutar el siguiente código JS en su consola:
// Register a callback function
function callback(text){ alert("In JS: "+Pointer_stringify(text)); }
var cb = Runtime.addFunction(callback);
_registerCallback(cb);
// Invoke it with some "C string"
var jsStr = "XOXOXO";
var cStr = allocate(intArrayFromString(jsStr), 'i8', ALLOC_NORMAL)
_triggerCallback(cStr);
// Free Emscripten heap and release the function pointer
_free(cStr);
Runtime.removeFunction(cb);
Debería ver una alerta con "En JS: XOXOXO ".
una cosa importante es que el número de punteros de función que son válidos simultáneamente es fijo y está especificado por 'emcc ... -s RESERVED_FUNCTION_POINTERS = 20 ...' –