在浏览器中使用 emscripten 生成的 JavaScript 文件中的 C++ API

Using C++ API in the browser from an emscripten-generated JavaScript file

假设我有一个基本的 C++ API 如下:

#include <random>
#include <emscripten/bind.h>

int getRandomInt(int low, int high) {
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_int_distribution<int> dist (low, high);
return dist(mt);
}

float getRandomFloat(float low, float high) {
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<float> dist (low, high);
return dist(mt);
}

EMSCRIPTEN_BINDINGS(hello_world_module) {
using namespace emscripten;
// function("lerp", &lerp);
function("getRandomInt", &getRandomInt);
function("getRandomFloat", &getRandomFloat);
}

我想为浏览器生成这些函数。就目前而言,我知道如何使用这些命令为节点 JavaScript 模块执行此操作:

em++ -std=c++11 -Wall -fPIC --minify 0 -O2 --bind --memory-init-file 0 \
-s DEMANGLE_SUPPORT=1 \
-s NO_EXIT_RUNTIME=1 \
random_api.cpp -o random_api.js

在节点内部我可以运行这些命令(比方说node run_random_api.js):

var random_api = require('./random_api.js')

console.log("getRandomInt(0, 100)", random_api.getRandomInt(0, 100));
console.log("getRandomInt(0, 100)", random_api.getRandomInt(0, 100));
console.log("getRandomInt(0, 100)", random_api.getRandomInt(0, 100));

现在如何让 run_random_api.js 在浏览器中工作? 我在 run_random_api.js 上尝试了 browserify 并将其转换为 bundle.js 但是说 random_api.getRandomInt 不是函数 (google-chrome 64.0.3282.167 )

您可以像加载任何其他脚本一样加载脚本 JavaScript。然后您可以通过 Module 访问导出的函数,例如 Module.getRandomInt()

在html里面加载脚本

<script type="text/javascript" src="random_api.js"></script>

然后你就可以像这样访问你的函数

function getRandomInt(low, high) {
    console.log(Module.getRandomInt(low,high));
}

您可以阅读有关 Module 对象 here 的更多信息。