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