Как передать пользовательский модуль из JS в C++

Передача пользовательского модуля из JS в C++ код с помощью Emscripten — задача проще, чем кажется!
Я создал небольшой пример, чтобы показать, как передать модуль из JS в C++ с помощью Emscripten и val::global().

Прежде всего, нам нужно написать функцию C++ для загрузки. Она выглядит следующим образом:

int loadCustomModule (std::string globalModuleName) {
  val ModuleClass = val::global(globalModuleName.c_str());
    if (!ModuleClass.as<bool>()) {
    std::cout << "No global module " << globalModuleName;
  }
  return 0;
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем нам нужно передать эту функцию в JS, используя EMSCRIPTEN_BINDINGS:

EMSCRIPTEN_BINDINGS(module) {
  function("loadCustomModule", &loadCustomModule);
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Да, вот и все! Теперь мы можем использовать нашу функцию loadCustomModule в JS.

class HelloWorldCustomModule {
    helloWorld() {
        console.log('Hello, World!')
    }
}
var Module = {
    onRuntimeInitialized: function () {
        window.HelloWorldCustomModule = HelloWorldCustomModule;
        Module.loadCustomModule('HelloWorldCustomModule')
    }
};
Вход в полноэкранный режим Выйти из полноэкранного режима

И последний шаг — использование нашего HelloWorldCustomModule в C++

int loadCustomModule (std::string globalModuleName) {
  // ... first part is above
  val module = ModuleClass.new_();
  module.call<val>("helloWorld");
  return 0;
}
Войти в полноэкранный режим Выход из полноэкранного режима

Компиляция

em++ -lembind -o passCustomModule.js passCustomModule.cpp -s ERROR_ON_UNDEFINED_SYMBOLS=0 -Wall --bind
Войти в полноэкранный режим Выйти из полноэкранного режима

Полный пример с HTML вы можете найти там

Оцените статью
devanswers.ru
Добавить комментарий