Объяснение
Вы можете запустить код JavaScript изнутри вашей функции C ++. Такой код JS имеет доступ ко всем объектам, к которым вы обычно имеете доступ при запуске его в веб-браузере. Для этого мы будем использовать макрос EM_ASM_INT , который выполняет код JS, возвращающий значение int
.
Быстрое решение
Мы вводим код JS внутри Код C ++ example.cpp
. Использование функции int main()
гарантирует, что код будет автоматически выполняться при загрузке страницы без необходимости загрузки модуля WebAssembly вручную. Однако вы можете использовать другую функцию, экспортировать ее и выполнить на своей веб-странице.
#include <iostream>
#include <emscripten.h>
int main()
{
int screen_width = EM_ASM_INT(
return screen.availWidth;);
std::cout << "Screen width=" << screen_width << std::endl;
}
Скомпилированный выше код example.cpp
с помощью компилятора Emscripten выглядит следующим образом :
emcc example.cpp -o example.html
Вывод представляет собой веб-страницу со встроенной функцией int main()
с кодом JS внутри (действительно, в начале). Чтобы выполнить код, допуская совместное использование ресурсов Cross-origin (CORS), мы будем использовать инструмент emrun (я не смог запустить пример на Firefox, поэтому вместо этого я использовал Chrome):
emrun --browser chrome example.html
Комментарий
Этот подход работает для JS кода с возвращаемым значением типа скаляр int
(с использованием EM_ASM_INT
), double
(с EM_ASM_DOUBLE
) , но также массив char*
(с использованием EM_ASM_INT
с тщательным и ручным управлением памятью, как показано здесь ).