我正在尝试使用SWIG来包装Java的一些C++代码。我有一个SWIG封装好的C++类(BitVector)。

我的问题是,我在另一个类上也有一个方法,该方法采用const BitVector& ranges类型的参数,但是SWIG将该参数包装为SWIGTYPE_p_BitVector

我得到了两个不同的SWIG包装文件:BitVector.javaSWIGTYPE_p_BitVector.java。当我从Java(实际上是Scala)调用该方法并显示一个BitVector对象时,我的Scala编译器抱怨我在需要BitVector的地方传递了SWIGTYPE_p_BitVector

SWIG是否应该自动生成代码,以便在需要const引用或指针时允许我传递包装的对象?我可以构造某种类型映射以将BitVector.swigCPtr字段拉出来吗?

我在Google上能找到的就是关于如何处理原始类型指针的说明。 typemaps.i中有类型映射,可让您传递例如当底层C函数想要一个int且仅打算读取它时,则为Java int*,但是对于SWIG生成的包装器类型,我找不到类似的东西。

最佳答案

所以我想我已经解决了。是的,SWIG应该允许您将包装的类传递给需要此类类引用或指针的函数。原来,我在这里遇到的问题是命名空间问题。
BitVector实际上定义为CSA::BitVector,并通过采用using的方法所在的文件获取const BitVector&。此using指令未将其放入我的SWIG文件中,因此SWIG认为BitVectorCSA::BitVector是两种不同的类型,并将它们都包装在一起。

我通过在.i文件中包含using CSA::BitVector解决了该问题。它不是从可传递包含中获取的。

10-05 21:31