通过数据序列化的 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
。
我想在 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
。