SWIG 不接受指针参数的包装对象
Posted
技术标签:
【中文标题】SWIG 不接受指针参数的包装对象【英文标题】:SWIG Not Accepting Wrapped Objects For Pointer Parameters 【发布时间】:2014-06-20 22:59:42 【问题描述】:我正在尝试使用 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
中有一些类型映射可以让你通过,例如一个 Java int
,当底层 C 函数想要一个 int*
并且只打算读取它时,我找不到任何与 SWIG 生成的包装器类型类似的东西。
【问题讨论】:
简短的回答是肯定的 SWIG 通常可以很好地处理这个问题,它不应该为 const 参考版本创建单独的类。 .i 文件可能有问题,您可以发布 .i 文件中显示包含和位向量定义的部分吗?您是否尝试过 SWIG 附带的一些测试文件,最简单的示例将表明这应该可以工作并且应该可以正常编译。 【参考方案1】:所以我想我已经解决了这个问题。是的,SWIG 应该允许您将包装的类传递给期望引用或指向此类类的指针的函数。事实证明,我在这里遇到的问题是命名空间问题。
BitVector
真正定义为CSA::BitVector
,并通过采用const BitVector&
的方法所在的文件获取using
。这个using
指令没有进入我的 SWIG 文件,所以 SWIG 认为 BitVector
和 CSA::BitVector
是两种不同的类型,并将它们都包装起来。
我通过在 .i 文件中包含 using CSA::BitVector
解决了这个问题。它不是从传递包含中获取的。
【讨论】:
以上是关于SWIG 不接受指针参数的包装对象的主要内容,如果未能解决你的问题,请参考以下文章
Swig:将成员变量(指向值的指针)转换为 python 列表