2016-04-05 65 views
2

我已經成功地使用了下列類型映射在痛飲接口文件,其中目標語言是Python:使用痛飲typemaps用java

%typemap(argout) track_t **phash_tracks { 
    %append_output(SWIG_NewPointerObj(%as_voidptr(*$1), $*1_descriptor, SWIG_POINTER_OWN)); 
} 

%typemap(in) track_t **phash_tracks (track_t *tracks) { 
    // Alternatively, check if $input is a 0 integer `PyObject`... 
    if ((SWIG_ConvertPtr($input, (void **) &tracks, $*1_descriptor, SWIG_POINTER_DISOWN)) == -1) 
    tracks = NULL; 
    $1 = &tracks; 
} 

然而,當我更改目標語言爲Java,我得到了很多的編譯當我嘗試構建痛飲產生自動生成的C包裝代碼時的錯誤,即

warning: implicit 
     declaration of function 'SWIG_ConvertPtr' is invalid in C99 [-Wimplicit-function-declaration] 
    if ((SWIG_ConvertPtr(jarg1, (void **) &tracks1, SWIGTYPE_p_track_t, SWIG_POINTER_DISOWN)) == -1) 

error: use of undeclared 
     identifier 'SWIG_POINTER_DISOWN' 
    if ((SWIG_ConvertPtr(jarg1, (void **) &tracks1, SWIGTYPE_p_track_t, SWIG_POINTER_DISOWN)) == -1) 

error: expected expression 
    %append_output(SWIG_NewPointerObj(%as_voidptr(*arg1), SWIGTYPE_p_track_t, SWIG_POINTER_OWN)); 

等等...

我注意到,被粘貼到代碼在Python情況下,在痛飲包裝代碼包含的SWIG_ConvertPtrSWIG_POINTER_DISOWN等聲明來自swigrun.swg

這個位於/usr/share/swig2.0/

這相當於代碼不被粘貼到痛飲包裝代碼在目標語言是java。我不完全確定爲什麼這種情況不會發生,因爲如果沒有它,它將無法編譯,因爲所有缺少類型映射所需的聲明。

用我的swig安裝程序打破了一些東西,還是我患有一個基本的誤解,就像你不能使用類似於java的類型映射或類似的東西?

我還在java的c封裝代碼中注意到,接口文件中的%append在自動生成的.c文件中逐字出現,即swig沒有替代任何東西。這也造成了許多編譯時錯誤之一..

回答

1

Python的類型系統與Java非常不同,所以SWIG運行時也不同。

manual

Java是夜風中爲數不多的非腳本語言模塊之一。由於SWIG利用Java語言提供的類型安全性,它採用與腳本語言不同的方法。特別是運行時類型檢查和運行時庫不被Java使用。

,您仍然可以寫爲Java typemaps,而是因爲他們最終需要是相當不同的,因爲它們不需要根本不存在像SWIG_ConvertPtr功能強類型的。

如果將它們寫入正確的類型映射可能與語言無關,但一旦開始編寫自定義類型映射而不是依賴SWIG庫之外的類型映射,它將迅速停止爲通用類型映射。在通用接口與SWIG以及對目標語言用戶感覺「正確」的接口之間有一個折衷。

+0

所以我假設.i文件是目標語言不可知的是錯誤的。我認爲可能是這樣。我將不得不回到文檔中,我正在嘗試爲java實現相同的功能,就像我在這裏爲python所做的那樣 - > http://stackoverflow.com/questions/36184402/how-to-apply-a-痛飲-類型映射換一個雙指針-結構參數的。即使用類型映射處理雙指針參數 – bph

+1

@bph我在http://stackoverflow.com/a/11967859/168175和http://stackoverflow.com/a/12767656/168175的答案在Java中是類似的例子,我認爲可能有幫助您。 – Flexo