2012-03-26 65 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