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

时间:2018-02-19 22:03:06

标签: javascript c++ emscripten

我们假设我有一个基本的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在浏览器中工作? 我在browserify上尝试run_random_api.js并将其转换为bundle.js,但说random_api.getRandomInt不是函数(google-chrome 64.0.3282.167)

1 个答案:

答案 0 :(得分:0)

您可以像任何其他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