我正在尝试使用emscripten构建一个使用std :: vector和std :: map的程序,并且编译成功。 但是,当我在Web浏览器(firefox / chrome)上运行它时,捕获了UnboundTypeError。
[03:21:26.453] UnboundTypeError:由于无法调用intArrayToVector 未绑定类型:Pi
这是使用生成的javascript代码的c ++代码和HTML文件。
TEST.CPP:
#include <vector>
#include <emscripten/bind.h>
using namespace emscripten;
std::vector<int> intArrayToVector(int* input, int num){
std::vector<int> vec;
for(int i=0; i<num; i++){
int val = *(input+i);
vec.push_back(val);
}
return vec;
}
EMSCRIPTEN_BINDINGS(test){
register_vector<int>("VectorInt");
function("intArrayToVector", &intArrayToVector, allow_raw_pointer<arg<0>>());
}
的test.html:
<html>
<body>
<script src="test.js"></script>
<script>
var num = 6;
var buf = Module._malloc(100);
var arr = new Int8Array(num);
for(var i=0; i<num; i++){
arr[i] = i+2;
}
Module.HEAP8.set(arr, buf);
var v = Module.intArrayToVector(buf, num);
for(var i=0; i<num; i++){
console.log(v.get(i));
}
Module._free(buf);
</script>
</body>
</html>
javascript代码由以下命令生成:
$ em ++ --bind test.cpp -o test.js
我该如何解决这个问题? 谢谢你的帮助!
答案 0 :(得分:5)
Embind doesn't support pointers to primitive types.“Pi”表示“指向整数。”
如果您事先知道数组的大小,可以尝试将数组作为const引用传递。 e.g。
std::vector<int> intArrayToVector(const int (&input)[100])
或者您可以欺骗并使用整数参数作为指针,并使用reinterpret_cast
将其视为指针。 e.g。
std::vector<int> intArrayToVector(uintptr_t input, size_t len) {
const int* ptr = reinterpret_cast<int*>(input);
....
}
或者你可以使用支持原始类型指针的the cwrap
API。