Я пытаюсь собрать с помощью emscripten программу, которая использует std :: vector и std :: map, и компиляция прошла успешно.
Однако, когда я запустил его в веб-браузере (firefox / chrome), UnboundTypeError был перехвачен.
[03: 21: 26.453] UnboundTypeError: Невозможно вызвать intArrayToVector из-за
несвязанные типы: Pi
Вот код C ++ и HTML-файл, который использует сгенерированный код JavaScript.
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
Как я могу решить эту проблему?
Спасибо за любую помощь!
Embind не поддерживает указатели на примитивные типы. «Пи» означает «указатель на целое число».
Если вы всегда будете знать размер массива заранее, вы можете попробовать передать массив в качестве константной ссылки. например
std::vector<int> intArrayToVector(const int (&input)[100])
Или вы можете обмануть и использовать целочисленный параметр для указателя и использовать reinterpret_cast
рассматривать это как указатель. например
std::vector<int> intArrayToVector(uintptr_t input, size_t len) {
const int* ptr = reinterpret_cast<int*>(input);
....
}
Или вы можете использовать cwrap
API который поддерживает указатели на примитивные типы.
Других решений пока нет …