У меня есть приведенная ниже структура C, в которой есть пара вложенных структур, с которыми мне было трудно справиться, используя мои знания SWIG.Все приведенное ниже легко переносится SWIG, за исключением saddr (адрес сокета C) и mac [6] (массив C, представляющий MAC-адрес).Поскольку 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;