我有下面的C结构,它有几个嵌套结构,使用我的SWIG知识已经证明很难处理。除了 saddr (C套接字地址)和 mac [6] (表示MAC地址的C数组)之外,以下所有内容都很容易被SWIG包装。由于SWIG给我指针值(SWIGTYPE_p_unsigned_char和SWIGTYPE_p_sockaddr),我想以某种方式调用辅助C函数将指针转换为char *。我有辅助功能,但我不知道将其插入SWIG的最佳方法。有没有办法配置getMac()和getSaddr()来调用辅助函数?
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;
答案 0 :(得分:1)
您可以使用javacode
类型地图执行此操作,例如:
%module test
%rename (realId) Sample::id;
%typemap(javacode) struct Sample %{
public byte getId() {
return 100-getRealId(); // Transform the real call
}
public void setId(byte value) {
setRealId(value+100);
}
%};
struct Sample {
char id;
};
重命名生成的getId()
和setId()
,但提供了一个Java get / set,可以根据SWIG生成(但重命名)的一个来编写。您可能希望将SWIG生成的私有设置为私有。