2014-06-20 29 views
1

我正在嘗試使用SWIG來封裝Java的一些C++代碼。我有一個C++類(BitVector),SWIG包裝很好。SWIG不接受用於指針參數的包裝對象

我的問題是,我也有一個方法在另一個類需要參數類型const BitVector& ranges,但SWIG包裝該參數爲SWIGTYPE_p_BitVector

我得到兩個不同的SWIG包裝文件生成:a 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生成的包裝類型。

+0

簡短的回答是yes SWIG通常處理這個就好了,它不應該爲const引用版本創建一個單獨的類。 .i文件可能有問題,你可以發佈.i文件的部分顯示includes和bitvector defs嗎?你有沒有試過SWIG附帶的一些測試文件,最簡單的例子會顯示這應該工作,應該編譯好。 – Schollii

回答

0

所以我想我已經解決了這個問題。是的,SWIG應該允許你將一個包裝類傳遞給一個期望引用或指向這樣的類的函數。事實證明,我在這裏遇到的問題是一個命名空間問題。

BitVector實際上定義爲CSA::BitVector,並且獲取using'd的文件,其中採用const BitVector&的方法位於該文件中。這using指令沒有把它放到我的SWIG文件中,所以SWIG認爲BitVectorCSA::BitVector是兩種不同的類型,並將它們都包裹起來。

我通過在.i文件中包含using CSA::BitVector解決了該問題。它沒有從傳遞包含中獲得。

相關問題