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.javaSWIGTYPE_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 认为 BitVectorCSA::BitVector 是两种不同的类型,并将它们都包装起来。

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

【讨论】:

以上是关于SWIG 不接受指针参数的包装对象的主要内容,如果未能解决你的问题,请参考以下文章

将外部指针包装到 SWIG 数据结构中

Swig:将成员变量(指向值的指针)转换为 python 列表

使用 SWIG 将 C++ 对象指针传递给 Python,而不是再次返回 C++

如何为双指针结构参数应用 SWIG 类型映射

SWIG C++ Python:通过引用或指针包装 int

SWIG Python - 包装一个需要指向结构的双指针的函数