以下是我从几篇文章和查看 Emscripten 捆绑代码中收集到的信息:
在 C++ 中:
#include <iostream>
#include <functional>
extern "C" {
void registerCallback(void(*back)(const char*));
void triggerCallback(char* message);
}
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";
}
}
在其他文章中缺少的一件重要事情是使用RESERVED_FUNCTION_POINTERS=...标志编译C++,例如:
em++ -std=c++11 -s RESERVED_FUNCTION_POINTERS=20 source.cpp -s EXPORTED_FUNCTIONS="['_registerCallback','_triggerCallback']" -o try.html
在浏览器中加载try.html后,您可以在控制台中执行以下JS代码:
function callback(text){ alert("In JS: "+Pointer_stringify(text)); }
var cb = Runtime.addFunction(callback);
_registerCallback(cb);
var jsStr = "XOXOXO";
var cStr = allocate(intArrayFromString(jsStr), 'i8', ALLOC_NORMAL)
_triggerCallback(cStr);
_free(cStr);
Runtime.removeFunction(cb);
你应该看到一个带有 "In JS: XOXOXO" 的警告框。
emcc ... -s RESERVED_FUNCTION_POINTERS=20 ...
指定。 - Xavier Combelle