我正在尝试使用emscripten和c ++进行一些库测试。我需要在c ++调用之间保持一些JavaScript变量,但我还是无法弄清楚如何去做。
我认为它要么是我想要的简单,要么就是不可能。这是一个独立的程序,没有别的东西在运行。以下是一个最小的例子:
#include <emscripten.h>
int main() {
//this works and prints 1
EM_ASM(
var x = 1;
console.log(x);
);
//this throws an error 'x is not defined'
EM_ASM(
console.log(x);
);
return 0;
}
我使用以下命令编译并运行代码:
emcc main.cpp
node a.out.js
第一次调用的输出正确,但第二次调用会引发未定义的错误。我需要一些方法来保持这个变量在调用之间的范围,所以我可以使用它。
有任何帮助吗?感谢。
答案 0 :(得分:1)
您可以在声明var
之前移除x
:
#include <emscripten.h>
int main() {
EM_ASM(
x = 1;
console.log(x);
);
EM_ASM(
console.log(x);
);
return 0;
}
这似乎适用于emcc v1.35
答案 1 :(得分:1)
虽然接受的答案是有效的,但是你可能会遇到一些难以追踪的错误。使用x = 0
可能会覆盖作用域链中的任何其他x
变量。
更好的解决方案是使用getter / setter函数:
CPP:
EM_ASM(
var x = 1;
setX(x);
);
EM_ASM(
var x = getX();
);
JS:
var x = 0;
function getX() {
return x;
}
function setX(newX) {
x = newX;
}
另一种解决方案是通过使用EM_ASM_INT
和EM_ASM_
将值返回并插入JS,将值存储在C ++中。 EM_ASM_INT
将javascript的返回值返回给cpp,而EM_ASM_
允许您使用$0
,$1
,$2
等将参数插入到javascript中。 / p>
int cppX = 0;
int main() {
int x = EM_ASM_INT({
var x = 1;
console.log(x);
return x;
});
cppX = x;
EM_ASM_({
var x = $0;
console.log(x);
}, cppX);
return 0;
}