簡體   English   中英

使用SWIG從C#使用C ++ uint8_t *

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM