Emscripten передача обратного вызова из C — Runtime.getFuncWrapper — Время выполнения не определено

#emscripten

#emscripten

Вопрос:

Я пытаюсь запустить эту суть, но без параметров компиляции. Моя попытка:

 // 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(amp;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)
 

Чего мне не хватает?

Ответ №1:

Прежде всего, глядя на 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
 

( $ экранировано здесь для bash)

Или, лучше, объявлено как зависимость библиотеки:

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