使用SWIG申请相同的C数据类型多种Java数据类型

问题描述:

我有我通过SWIG暴露在我的Java二层C函数,并均与一个const void *的数据类型(“VAL)的输入参数是必须为addCategory功能uint8_t但对于功能的addAttribute一个字符。我目前在SWIG接口文件,使用%适用于映射常量无效* C类型为短在Java端。有修改SWIG接口文件的方式来从头文件同时支持一个char(字符串)和用于常量无效*输入参数uint8_t(短)使用SWIG申请相同的C数据类型多种Java数据类型

C函数:

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

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

痛饮接口文件:

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

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

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

  1. 使用类型层次 - 基类型将是功能需要什么,子类将得到裹也。你可以这样做在C++侧,或使用痛饮的类型映射设施在Java的一面。我认为这是不必要的复杂,所以我在这里没有举出一个例子。
  2. 使用过载(甚至是不同的功能,具有完全不同的名字 - 你可以使用%rename,使它们放回在Java中重载,即使他们在C不同的名称)
  3. 使用union。这将痛饮得到包裹着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适当typemaps。