我已經成功地使用了下列類型映射在痛飲接口文件,其中目標語言是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_ConvertPtr
,SWIG_POINTER_DISOWN
等聲明來自swigrun.swg
這個位於/usr/share/swig2.0/
這相當於代碼不被粘貼到痛飲包裝代碼在目標語言是java。我不完全確定爲什麼這種情況不會發生,因爲如果沒有它,它將無法編譯,因爲所有缺少類型映射所需的聲明。
用我的swig安裝程序打破了一些東西,還是我患有一個基本的誤解,就像你不能使用類似於java的類型映射或類似的東西?
我還在java的c封裝代碼中注意到,接口文件中的%append
在自動生成的.c文件中逐字出現,即swig沒有替代任何東西。這也造成了許多編譯時錯誤之一..
所以我假設.i文件是目標語言不可知的是錯誤的。我認爲可能是這樣。我將不得不回到文檔中,我正在嘗試爲java實現相同的功能,就像我在這裏爲python所做的那樣 - > http://stackoverflow.com/questions/36184402/how-to-apply-a-痛飲-類型映射換一個雙指針-結構參數的。即使用類型映射處理雙指針參數 – bph
@bph我在http://stackoverflow.com/a/11967859/168175和http://stackoverflow.com/a/12767656/168175的答案在Java中是類似的例子,我認爲可能有幫助您。 – Flexo