Oto co mam zebrane z kilku stanowisk i patrząc na emscripten dołączony kod:
w 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";
}
}
Ważną rzeczą, której brakowało w innych postach, jest do kompilacji C++ z RESERVED_FUNCTION_POINTERS = ... flaga, np:
em++ -std=c++11 -s RESERVED_FUNCTION_POINTERS=20 source.cpp -s EXPORTED_FUNCTIONS="['_registerCallback','_triggerCallback']" -o try.html
Po załadunku try.html w przeglądarce, można wykonać następujący kod JS w swojej konsoli:
// 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);
powinien pojawić się alert „w JS: XOXOXO ".
ważne jest to, że liczba wskaźników funkcji, które są jednocześnie poprawne, jest stała i określona przez 'emcc ... -s RESERVED_FUNCTION_POINTERS = 20 ...' –