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