Удаление генерируемых SWIG геттеров / сеттеров из структуры Java-класса - PullRequest
3 голосов
/ 26 марта 2012

Я использую карту типов javacode, чтобы добавить некоторые дополнительные функции вместо сгенерированных SWIG.Я хотел бы удалить сгенерированный по умолчанию метод получения и установки SWIG для unsigned char mac[6]; (public short[] getMac() и public void setMac(short[] value)) структуры details_t_.Я пытался использовать директиву %ignore details_t_::setMac;, но она не работает.Любые предложения в качестве соответствующей техники для этого?

%module Test
%typemap(javacode) struct details_t_ %{
    public String getMacAddress() {
        return Test.getMacAddressAsString(this); //another API in Test.java
    }

%};

%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 Ответ

4 голосов
/ 27 марта 2012

Вместо того, чтобы говорить %ignore с помощью установщика и получателя, назовите само поле непосредственно, например:

%module Test
%typemap(javacode) struct details_t_ %{
    public String getMacAddress() {
        return Test.getMacAddressAsString(this); //another API in Test.java
    }

%};

// Ignore field, not get/sets
%ignore details_t_::mac;
%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;

Если вы хотите сделать его неизменным вместо скрытого (т. Е. Только получатель, без установщика)генерируется) вы можете написать:

%immutable details_t_::mac;

вместо %ignore в предыдущем примере.

Если вы хотите сделать всю структуру неизменной, вы можете сделать:

// Read only, i.e. only getters
%immutable;
%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;

// Cancel the immutable directive
%mutable; 
...