javascript - 将JS函数传递给Emscripten生成的代码

  显示原文与译文双语对照的内容
0 0

我有条C++代码转换为通过Emscripten Javascript 。 我想转换的C++代码回调到Javascript调用该成员的代码。 就像这样:

java script :

function callback(message) {
    alert(message);
}
ccall("my_c_function", ..., callback);

c++:

void my_c_function(whatever_type_t *callback) {
    callback("Hello World!");
}

这是可能以某种方式?

时间:原作者:3个回答

0 0

我相信接受的答案是有点过时。

请参阅这颗子弹点放在" 与代码交互" emscripten教程

e .g 。 c :

void invoke_function_pointer(void(*f)(void)) {
  (*f)();
}

js :

var pointer = Runtime.addFunction(function() { 
  console.log('I was called from C world!'); 
});
Module.ccall('invoke_function_pointer', 'number', ['number'], [pointer]);
Runtime.removeFunction(pointer);

这样C代码不需要了解它的transpiled JS和任何需要网桥可以纯粹被JS程序控制。

( 代码侵入邮件编辑器,可能包含错误)

原作者:
0 0

一个Emscripten中经常做的事情就是强类型映射到简单的款式。

js :

function callback(message) {
    alert(message);
}
var func_map = {
    0: callback
};
// C/C++ functions get a _ prefix added
function _invoke_callback(callback_id, text_ptr) {
    func_map[callback_id](Pointer_stringify(text_ptr));
}
ccall("my_c_function", ..., 0);

c++:

// In C/C++ you only need to declare the func signature and
// make sure C is used to prevent name mangling
extern "C" void invoke_callback(int callback_id, const char* text);
void my_c_function(int callback_id) {
    invoke_callback( callback_id, "Hello World!" );
}

当然,你可以添加胶水代码,这就变得非常流畅。

原作者:
0 0

我需要写一些非常类似于中描述了这个问题。 我的代码最后把如下所示:

c :

void call(void (*back)(char*)){
    back("Hello!");
}

js :

function back(text){
    alert(Pointer_stringify(text));
}
var pointer = Runtime.addFunction(back);
var call = Module.cwrap('call', 'void', ['pointer']);
call(pointer);
Runtime.removeFunction(pointer);

请注意,指针返回给回调被取消引用,我们不得不 Pointer_stringify

我有完整的工作代码上 GitHub 。

原作者:
...