Я хотел бы создать std::vector
(в частности, std::vector<string>
) на С++, а затем передать его (точнее, указатель на него) в Javascript, чтобы иметь доступ к его данным/функциям из непосредственно написанного Javascript.
Пока я могу получить целочисленный указатель:
vector<string> myVector;
myVector.push_back("First item");
myVector.push_back("Second item");
EM_ASM_ARGS({
// Prints out an integer value of the pointer,
// but I would like to access the object members/data
// of myVector
console.log($0);
}, &myVector);
Я нашел информацию по адресу http://kripken.github.io/emscripten-site/docs/api_reference/bind.h.html#register_vector__cCP и http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/embind.html#built-in-type-conversions о функции register_vector
#include <emscripten/bind.h>
EMSCRIPTEN_BINDINGS(Wrappers) {
register_vector<std::string>("VectorString");
};
который можно использовать для создания нового вектора из мира Javascript:
var myVector = new Module.VectorString();
но я не могу понять, как использовать это для доступа к вектору, который уже существует в мире С++.
Если я попытаюсь использовать Module.Runtime.dynCall('v', $0, []);
для указателя, как в https://stackoverflow.com/a/29319440/1319998, когда передавая указатели на функции, я получаю сообщение об ошибке:
Invalid function pointer '380' called with signature 'v'
Я пробовал несколько разных комбинаций сигнатур, и все они, похоже, терпят неудачу (что меня не очень удивляет: на самом деле я вызываю не указатель функции, а указатель на экземпляр объекта)