2016-02-26 2 views
0

У меня есть тип данных, который я хотел бы использовать как в 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)); 

Есть идеи?

ответ

0

Решение закончилось тем, что не назначало %typemap(jni) или %typemap(jtype) (т. Е. Оставляя их по умолчанию как SWIG), а также написание тонкой обертки вокруг std::string. SWIG предоставил мою обертку getCPtr, которую я мог бы использовать в моей карточной карте javain.

Я не мог понять, как получить swigCPtr для встроенного Java.

Смежные вопросы