我想创建一个函数来计算一些东西。完成后调用回调函数。
void calculate(int param1, ..., std::function<void(void)> callback) {
//code...
callback();
}
函数的绑定(bind)是使用 Embind
创建的:
EMSCRIPTEN_BINDINGS(my_module) {
function("calculate", &calculate);
}
但如果我尝试调用 Module.calculate(0, ..., function(){/*...*/})
,我会收到此错误:
UnboundTypeError: Cannot call calculate due to unbound types: NSt3__18functionIFvvEEE
最佳答案
我不确定这是否是唯一的方法,但是为了从 Js -> C++ 传递回调,我不得不
- 不使用
std::function
,而是原始函数指针 - 使用
Runtime.addFunction
获取 Javascript 函数的 C++ 函数指针,并将其传递到 C++ 世界,而不是尝试直接传递 Javascript 函数。 - 不使用
EMBIND
,而是使用cwrap
/ccall
API .
对于您的示例,稍微简化接口(interface)以便仅从 JS -> C++ 传递回调,C++ 可能如下所示:
extern "C" {
EMSCRIPTEN_KEEPALIVE
void calculate(void (*callback)()) {
callback();
}
}
创建回调函数指针的 Javascript 看起来像
var callbackPointer = Module.Runtime.addFunction(function() {
console.log('In the callback');
});
并调用函数,传递指针(作为“数字”):
Module.ccall('calculate', 'number', ['number'], [callbackPointer]);
然后编译确保为函数指针预留空间:
em++ app.cpp -s RESERVED_FUNCTION_POINTERS=1 -o app.js
关于javascript - 嵌入传递 lambda 函数作为回调参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36371178/