自定义SWIG环绕处理嵌套C结构

时间:2012-03-22 22:01:48

标签: swig

我有下面的C结构,它有几个嵌套结构,使用我的SWIG知识已经证明很难处理。除了 saddr (C套接字地址)和 mac [6] (表示MAC地址的C数组)之外,以下所有内容都很容易被SWIG包装。由于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 个答案:

答案 0 :(得分:1)

您可以使用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生成的私有设置为私有。