Dưới đây là những gì tôi đã thu thập được từ một số bài viết và bằng cách nhìn vào Emscripten kèm mã:
Trong 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";
}
}
Một điều quan trọng, mà đã mất tích trong bài viết khác, là để biên dịch C++ với RESERVED_FUNCTION_POINTERS = ... cờ, ví dụ:
em++ -std=c++11 -s RESERVED_FUNCTION_POINTERS=20 source.cpp -s EXPORTED_FUNCTIONS="['_registerCallback','_triggerCallback']" -o try.html
Sau khi tải try.html vào trình duyệt, bạn có thể thực thi mã JS sau trong giao diện điều khiển của nó:
// 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);
Bạn sẽ thấy một cảnh báo với "Trong JS: xoxoxo ".
một điều quan trọng là số lượng các con trỏ hàm có giá trị đồng thời được cố định và được chỉ định bởi 'emcc ... -s RESERVED_FUNCTION_POINTERS = 20 ...' –