如何从启动时通过JavaScript检测到的值初始化C++变量(编译为WebAssembly) (如当前screen.availWidth)?
这段代码需要从WebAssembly模块启动,因此用户不能注入与实际值不同的值。
发布于 2020-02-28 19:35:02
解释
您可以从C++函数内部运行JavaScript代码。这样的JS代码可以访问您在web浏览器中运行时通常可以访问的所有对象。为此,我们将使用EM_ASM_INT宏来执行返回int值的JS代码。
快速解决方案
我们将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;
}我们使用Emscripten compiler编译上面的example.cpp代码,如下所示:
emcc example.cpp -o example.html输出的是一个嵌入了JS代码的int main()函数的网页(真的是inception)。为了在允许跨域资源共享(CORS)的同时运行代码,我们将使用emrun工具(我无法在火狐上运行示例,所以我使用Chrome ):
emrun --browser chrome example.html评论
此方法适用于返回值为标量int类型(使用EM_ASM_INT)、double类型(使用EM_ASM_DOUBLE),但返回值为char*数组的JS代码(使用EM_ASM_INT并仔细手动进行内存管理,如here所示)。
https://stackoverflow.com/questions/59790919
复制相似问题