2012-03-26 63 views
3

我正在使用javacode typemap來添加一些附加函數來代替SWIG生成的函數。我想刪除details_t_結構的unsigned char mac[6];public short[] getMac()public void setMac(short[] value))SWIG生成的默認獲取器和設置器。我試圖使用%ignore details_t_::setMac;指令,但它不起作用。任何建議作爲一個適當的技術來做到這一點?從結構Java類中刪除SWIG生成的Getter/Setter

%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; 

回答

4

與其說%ignore與setter和getter的,命名字段本身直接,如:

%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; 

如果你想讓它一成不變的,而不是隱藏(即只有一個getter,沒有setter生成),你可以這樣寫:

%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; 
+0

我的目標是提供Details.java的Java表示,只有具有getter和setter方法沒有。我基本上想要使它成爲一個不可變的對象,因爲這些使用方法只會調用getters來獲取數據。所以我只想隱藏二傳手,這有可能嗎? – c12 2012-03-27 16:08:11

+0

@ c12 - 我添加了一個使其不變的示例 – Flexo 2012-03-27 16:44:01

+0

謝謝你完美工作。 – c12 2012-03-27 17:19:12