1
我有下面的C結構,它有一對嵌套的結構,已證明很難處理我的SWIG知識。下面的所有內容都很容易被SWIG包裝,除了saddr(C套接字地址)和mac [6](表示MAC地址的C數組)。由於SWIG給了我指針值(SWIGTYPE_p_unsigned_char和SWIGTYPE_p_sockaddr),我想以某種方式調用幫助器C函數將指針轉換爲char *。我有幫助函數,但我不知道將其插入SWIG的最佳方法。有什麼辦法可以配置getMac()和getSaddr()來調用幫助函數嗎?自定義SWIG包裝來處理嵌套的C結構
C語言結構試圖總結:
%rename (Details) details_t_;
typedef struct details_t_ {
uint16_t code;
char *name;
**sockaddr *saddr;**
uint32_t saddr_len;
uint8_t flag;
ios_boolean is_child;
**unsigned char mac[6];**
} details_t;
生成的Java代碼:
public void setMac(SWIGTYPE_p_unsigned_char value) {
TestJNI.Details_mac_set(swigCPtr, this, SWIGTYPE_p_unsigned_char.getCPtr(value));
}
public SWIGTYPE_p_unsigned_char getMac() {
long cPtr = TestJNI.Details_mac_get(swigCPtr, this);
return (cPtr == 0) ? null : new SWIGTYPE_p_unsigned_char(cPtr, false);
}
public void setSaddr(SWIGTYPE_p_sockaddr value) {
TestJNI.Details_saddr_set(swigCPtr, this, SWIGTYPE_p_sockaddr.getCPtr(value));
}
public SWIGTYPE_p_sockaddr getSaddr() {
long cPtr = TestJNI.Details_saddr_get(swigCPtr, this);
return (cPtr == 0) ? null : new SWIGTYPE_p_sockaddr(cPtr, false);
}
建議SWIG.i變化:
%module Test
%rename (realId) details_t_::mac;
%typemap(javacode) struct details_t_ %{
public String getMac() {
return Test.getMacAddressAsString(this);
//this is a pointer to details_t_ struct
}
%};
%rename (Details) details_t_;
typedef struct details_t_ {
uint16_t code;
char *name;
**sockaddr *saddr;**
uint32_t saddr_len;
uint8_t flag;
ios_boolean is_child;
**unsigned char mac[6];**
} details_t;
謝謝你的例子。我將它應用於我的SWIG.i(見上文),一切似乎都正常。我正在做一些與你不同的事情。我從新的getter(getId())調用另一個c函數,它需要一個指向struct(Sample)的指針來返回正確的值。我只是通過「這個」,它的工作原理,但有沒有這樣做的記憶影響? – c12 2012-03-23 22:20:22
如果我想爲同一個結構體應用多個javacode類型映射表,有可能嗎?我試圖複製%rename和%typemap代碼並將其應用於不同的結構屬性,但它只創建模塊中指定的最後一個。 – c12 2012-03-23 22:34:12
@ c12我認爲每種類型只能有一個javacode typemap。你所描述的聽起來不錯 – Flexo 2012-03-24 14:17:42