未定义从C-Runtime.getFuncWrapper-Runtime传递回调的脚本



我正在尝试运行这个Gist,但没有编译参数。我的尝试:

// file: pass_array.cpp
#include <cstdio>
extern "C" {
extern void initialize(void (*callback)(float*));
}
void callback(float* output)
{
for (int i = 0; i < 2; ++i)
{
output[i] = i+1;
}
printf("Callback was invokedn");
}
int main()
{
initialize(&callback);
return 0;
}
// file: pass_array_library.js
// "use strict";
var LibraryTst = {
initialize: function (callback) {
callback = Runtime.getFuncWrapper(callback, 'vi') // error here
var numBytes = 2 * Float32Array.BYTES_PER_ELEMENT
var ptr = Module._malloc(numBytes)
try {
callback(ptr)
console.log('Callback filled buffer like so:')
var i = 0
for (i = 0; i < 2; ++i) {
console.log(HEAPF32[(ptr/Float32Array.BYTES_PER_ELEMENT)+i])
}
}
finally {
Module._free(ptr)
}
},
}
mergeInto(LibraryManager.library, LibraryTst)

编译:

emcc -O1 -Wall -Werror --bind -o pass_array.html --js-library pass_array_library.js pass_array.cpp

当我打开html时,我得到

pass_array.html:1 exception thrown: ReferenceError: Runtime is not defined,ReferenceError: Runtime is not defined
at _initialize (http://0.0.0.0:8000/pass_array.js:2119:7)

我错过了什么?

首先,查看FAQ,Runtime对象已经消失,而应该直接调用函数getFuncWrapper

callback = getFuncWrapper(callback, 'vi');

但是库函数getFuncWrapper也必须显式导出。必须以$为前缀。有两种选择。在命令行上传递:

emcc --bind -o pass_array.html --js-library pass_array_library.js 
-s DEFAULT_LIBRARY_FUNCS_TO_INCLUDE=[$getFuncWrapper] pass_array.cpp

($逃离此处狂欢(

或者,更好的是,声明为库的依赖项:

var LibraryTst = {
initialize: function (callback) { ... },
initialize__deps: ['$getFuncWrapper'],  // !
}

最新更新