I have two C functions that I’m exposing through SWIG to my Java layer and both have an input param with a const void * data type (“val) that needs to be a uint8_t for the addCategory function but a char for the addAttribute function. I’m currently, in the SWIG Interface file, using the %apply to map the const void * C type to a short on the Java side. Is there a way to modify the SWIG interface file to support both a char (String) and a uint8_t (short) for the const void * input parameter?
C Functions from header file:
int
addCategory(query_t *query, type_t type, const void *val);
int
addAttribute(query_t *query, type_t type, const void *val);
SWIG Interface File:
%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"
You can’t directly do this – what type would be used in this place in Java? You need to help SWIG decide that in some way.
You have (at least) three possible solutions:
%renameto make them back into overloads in Java even if they have different names in C)Use a
union. This will get wrapped withsetandgetfunctions by SWIG:This results in a Java class called
values, whichfunc()takes and can pass one of the members of the union through. Clearly you’d want to%applyappropriate typemaps for the members of theunion.