【发布时间】:2022-06-12 17:02:38
【问题描述】:
好的,我一直在反对这一点。我更像是一个专注于 JavaScript 和 C# 的开发人员,但我在 c++ 方面有一些经验。我的问题是
- 我需要找到一种简单的方法来获取 Javascript 对象并通过 WebAssembly 将其传递给 c++
- 我需要对 Javascript 数组做同样的事情
- 我可能需要对 Javascript 对象的 Javascript 数组做同样的事情
所以从我在一个简单数组上尝试过的开始:
//c++
int testArr(int * arrIn, int length){
int results = 0;
for(int i = 0; i < length; i++){
results += arrIn[i] + 1;
}
return results;
}
//javascript
let arr = [20, 50, 90, 62, 98];
console.log(wasmInstance.exports.testArr(arr, arr.length));
所以这应该是一个整数数组,将它们加1(基本上是为了测试循环)。它返回 5。我希望它返回 325。所以查看类型化数组是下一个合乎逻辑的步骤...
//c++
int testArr(int * arrIn, int length){
int results = 0;
for(int i = 0; i < length; i++){
results += arrIn[i] + 1;
}
return results;
}
//javascript
let arr = [20, 50, 90, 62, 98];
let typedArray = new Int32Array(arr);
//test 1
console.log(wasmInstance.exports.testArr(typedArray, arr.length));
//test 2
console.log(wasmInstance.exports.testArr(typedArray.buffer, arr.length));
测试 1 再次返回 5。测试 2 返回 0。
现在只是看看我是否可以让 c++ 返回一个数组:
//c++
int * test(){
int arr[] = {12, 32, 54, 31};
return arr;
}
//Javascript
console.log(wasmInstance.exports.test());
返回 -16。有点时髦,可能是由于两者之间的指针问题。现在如果我试试这个:
//c++
int test(){
int arr[] = {12, 32, 54, 31};
return arr[0];
}
//Javascript
console.log(wasmInstance.exports.test());
现在它返回 12。
到目前为止,这就是我在传递数组方面所获得的,这在大多数情况下似乎是不可能的。现在,传递对象。神救救我。请善待 c++,因为它不是我最擅长的语言。
//c++
class Vector3{
public:
float x;
float y;
float z;
Vector3(float X, float Y, float Z){
x = X;
y = Y;
z = Z;
}
};
int test(Vector3 position){
return position.x;
}
//javascript
let position = {x: 21, y: 30, z: 12};
console.log(wasmInstance.exports.test(position));
这将返回 0 而不是 21;
现在对于邪恶的三位一体,一组 javascript 对象...
//c++
class Vector3{
public:
float x;
float y;
float z;
Vector3(float X, float Y, float Z){
x = X;
y = Y;
z = Z;
}
};
Vector3 test(Vector3 positions[], int length){
return positions[0];
}
//javascript
let positions = [{x: 21, y: 30, z: 12},{x:15, y: 24, z: 14}]
console.log(wasmInstance.exports.test(positions, positions.length));
这将返回未定义。
所以问题是,我是在 c++、javascript、wasm、所有 3 中搞砸了,还是什么?我花了 3 天时间在互联网上寻找答案,我唯一能找到的是声明这是可能的,没有示例或文档说明如何做到这一点。我找到的最好的文档是 DevRant,它仍然没有给我答案。
那么这可能吗?如果可以,是否有任何我可以遵循的工作示例,或者这根本不可能?
【问题讨论】:
-
前段时间我玩过 emscripten。你可以试试这个例子github.com/werto87/emscripten_webidl
-
没关系。我认为真正的答案是不可能通过 Web Assembly 将数组、对象或对象数组从 Javascript 传递到 c++ 或以其他方式取回它们。原因似乎是不可能在两者之间共享指针,并且没有办法解决这个问题。这实际上意味着 WebAssembly 仅限于简单的字符串、字符、int、double、float 等。除此之外的任何东西都是白日梦,至少在我被证明不是这样之前,我是这样看待它的。谢谢你的工具。它没有解决它,但它确实帮助我缩小了范围。
-
字符串可能,但数组不可能听起来很可疑。我更新了示例以在 java 脚本中使用一组 c++ 对象。请注意,它是一个快速实现来显示数组有效。
-
帽子不太对劲。您可以使用
emscripten::val对象类型将javascript 数组从std::array对象中复制,该对象类型允许您存储任何javascript 对象。结帐documentation。有一个emscripten::val::vecFromJSArray函数从 JS 数组返回std::vector<T> -
是的,你可以,但你应该使用 Emscripten 文档emscripten.org/docs/porting/connecting_cpp_and_javascript/… 中描述的 EMSCRiPTEN_BINDINGS 我有时间会发布答案。
标签: javascript c++ webassembly