代码之家  ›  专栏  ›  技术社区  ›  0__

Emscripten从C传递回调函数-Runtime.getFuncWrapper-未定义运行时

  •  0
  • 0__  · 技术社区  · 4 年前

    我试着跑 this 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)
    

    我错过了什么?

    0 回复  |  直到 4 年前
        1
  •  0
  •   0__    4 年前

    首先,看看 FAQ ,the 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'],  // !
    }