Передача пользовательского модуля из 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 вы можете найти там