使用SWIG为同一C数据类型应用多个Java数据类型

时间:2011-11-29 18:16:24

标签: swig

我有两个C函数,我通过SWIG暴露给我的Java层,并且都有一个带有const void *数据类型(“val”)的输入参数,需要为addCategory函数的uint8_t但是为char addAttribute函数。我目前在SWIG接口文件中,使用%apply将const void * C类型映射到Java端的short。有没有办法修改SWIG接口文件以支持char (String)和const void *输入参数的uint8_t(short)?

头文件中的C函数:

int
addCategory(query_t *query, type_t type, const void *val);

int
addAttribute(query_t *query, type_t type, const void *val);

SWIG接口文件:

%module Example
%include "stdint.i"
void setPhy_idx(uint32_t value);
%include "arrays_java.i"
void setId(unsigned char *value);
%{
#include "Example.h"
%}
%apply char * { unsigned char * };
%apply char * { void * };
%apply uint8_t { const void * }
%apply int32_t { int32_t * }
%include "Example.h"

1 个答案:

答案 0 :(得分:0)

你不能直接这样做 - 在Java中这个地方会使用什么类型?您需要帮助SWIG以某种方式决定。

您(至少)有三种可能的解决方案:

  1. 使用类型层次结构 - 基类型将是函数所用的类型,子类也将被包装。您可以使用SWIG的typemap工具在C ++端或Java端执行此操作。我认为这是不必要的复杂,所以我在这里没有举例。
  2. 使用重载(甚至是不同的函数,完全使用不同的名称 - 即使它们在C中有不同的名称,您也可以使用%rename使它们重新进入Java中的重载。
  3. 使用union。这将由SWIG编写setget函数:

    %module test
    
    union values {
      unsigned char *string;
      void *generic;
      uint8_t someOtherThing;
      uint32_t number;
    };
    
    void func(values v);
    

    这会产生一个名为values的Java类,func()占用并可以通过union的其中一个成员。显然,您需要为%apply的成员union提供适当的字体图。