在浏览器中使用 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 的更多信息。
假设我有一个基本的 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 的更多信息。