我想创建一个计算某些东西的函数.完成后,它会调用回调函数.
void calculate(int param1, ..., std::function<void(void)> callback) {
//code...
callback();
}
使用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.
对于您的示例,稍微简化界面,以便仅从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