我正在尝试使用SWIG来包装Java的一些C++代码。我有一个SWIG封装好的C++类(BitVector
)。
我的问题是,我在另一个类上也有一个方法,该方法采用const BitVector& ranges
类型的参数,但是SWIG将该参数包装为SWIGTYPE_p_BitVector
。
我得到了两个不同的SWIG包装文件:BitVector.java
和SWIGTYPE_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认为BitVector
和CSA::BitVector
是两种不同的类型,并将它们都包装在一起。
我通过在.i文件中包含using CSA::BitVector
解决了该问题。它不是从可传递包含中获取的。