首页 > 解决方案 > Emscripten 从 C 传递回调 - Runtime.getFuncWrapper - 未定义运行时

问题描述

我正在尝试运行此 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 invoked\n");
}

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)

我错过了什么?

标签: emscripten

解决方案


首先看FAQRuntime对象消失了,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

$在这里为 bash 转义)

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

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

推荐阅读