Пользовательская SWIG-упаковка для обработки вложенных структур C - PullRequest
2 голосов
/ 23 марта 2012

У меня есть приведенная ниже структура 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;

1 Ответ

1 голос
/ 23 марта 2012

Вы можете сделать это с помощью 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 частными.

...