[英]Use c++ uint8_t * from c# using SWIG
我有一個看起來像這樣的功能:
virtual int64_t Read(uint8_t* buffer, int64_t bufferLength) = 0
我們要覆蓋的內容(因為這是一個抽象類)和c#代碼的實現(使用Director)。 運用
%include "arrays_csharp.i"
%apply uint8_t INPUT[] {uint8_t* buffer}
我可以使用以下簽名進行ac#翻譯
public virtual long Read(byte[] buffer, long bufferLength)
這就是我想要的。 但是,當嘗試編譯SWIG代碼時,出現如下錯誤:
error C2440: '=': cannot convert from 'void *' to 'unsigned char *'
note: Conversion from 'void*' to pointer to non-'void' requires an explicit cast
由於這個原因,在生成的swig cc文件中:
int64_t c_result = SwigValueInit< int64_t >() ;
long long jresult = 0 ;
unsigned char* jbuffer = 0 ;
long long jbufferLength ;
long long jbufferOffset ;
if (!swig_callbackRead__SWIG_0) {
throw Swig::DirectorPureVirtualException("mip::Stream::Read");
} else {
jbuffer = (void *) buffer; <========= FAIL LINE
jbufferLength = bufferLength;
jresult = (long long) swig_callbackRead__SWIG_0(jbuffer, jbufferLength);
c_result = (int64_t)jresult;
}
如何告訴SWIG不要轉換為(void *)?
似乎directorin型圖在這里不太合適。 我認為這應該足以解決它,在%apply
指令之后:
%typemap(directorin) uint8_t *buffer "$input = $1;"
上面的類型映射僅匹配名為buffer
非常量uint8_t*
參數。 如果需要,我們可以使通用性更高,例如:
%typemap(directorin) SWIGTYPE * "$input = $1;"
將匹配沒有更好匹配的任何東西,無論是const還是非const。 我仍然無法弄清楚為什么這不是默認設置,因此這里存在着可能會破壞我未曾想到的其他地方的風險,因此您可能希望在應用此方法的地方繼續保持選擇性。
您還可以執行以下操作:
%typemap(directorin) SWIGTYPE * "$input = ($1_ltype)$1;"
或添加另一個變體:
%typemap(directorin) const SWIGTYPE * "$input = const_cast<$1_ltype>($1);"
來自編譯器的錯誤消息很簡單。 您應該將void *
顯式轉換為unsigned char *
。
嘗試:
jresult = (long long) swig_callbackRead__SWIG_0(static_cast<unsigned char *>(jbuffer), jbufferLength);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.