通过数据序列化的 SWIG 接口?

SWIG interface via data serialization?

我想在 Java 和 C++ 中使用一个数据类型:

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 文件之外)甚至不需要知道如何转换 to/from 字符串?看起来应该是可能的。我遇到的问题是:

%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));

有什么想法吗?

解决方案最终涉及不分配 %typemap(jni)%typemap(jtype)(即保留它们作为 SWIG 的默认值),并围绕 std::string 编写一个薄包装。 SWIG 为我的包装器提供了一个 getCPtr 我可以在我的 javain 类型映射中使用。

我不知道如何为 Java 内置函数获取 swigCPtr