У меня есть тип данных, который я хотел бы использовать как в Java и C++:Интерфейс SWIG через сериализацию данных?
MyObj foo(const MyObj& input);
std::vector<MyObj> bar(std::vector<MyObj>& input);
хитрость заключается в том, что MyObj
определяется в 3 партии (закрытым исходным кодом) инструмент, который доступен для меня как в Java и C++ (они тоже использовали SWIG). Мой первый подход состоял в том, чтобы попытаться использовать их обертки SWIG для моих целей, но теперь я изучаю второй подход, который использует рычаги вместо этого, чтобы я мог сериализовать свои данные в строку. То есть, у меня есть эти функции:
В Java:
String toString(MyObj mo);
MyObj fromString(String s);
и в C++:
std::string toString(const MyObj& mo);
MyObj fromString(const std::string& s);
Могу ли я создать SWIG оболочку, для которой код, который я пишу (за пределами SWIG файл) даже не нужно знать о преобразовании в/из строк? Казалось бы, это должно быть возможно. Часть я застрял на том, что это:
%typemap(jni) MyObj& "std::string";
%typemap(jtype) MyObj& "String";
%typemap(jstype) MyObj& "MyObj";
%typemap(javain,
pre="String ret = toString($javainput);\n",
pgcppname="ret")
MyObj& "$javaclassname.getCPtr(ret)";
%template(VectorMyObj) std::vector<MyObj>;
был генерируя эту ошибку в JAVAC:
./VectorMyObj.java:74: error: incompatible types: String cannot be converted to SWIGTYPE_p_MyObj
exampleJNI.VectorMyObj_add(swigCPtr, this, SWIGTYPE_p_MyObj.getCPtr(ret));
Есть идеи?