我有以下SWIG接口文件结构,我觉得无效。 int func(usigned char key [20])位于headerThree.h中。当我离开%include“HeaderThree.h”时,我得到一个重复的int func(SWIGTYPE_p_unsigned_char key);.如果我删除%include“HeaderThree.h”,其他函数不会显示在生成的Example.java文件中..只有int func(short []键)。我想配置SWIG .i文件没有 func(SWIGTYPE_p_unsigned_char key)函数,但要将其余函数包含在HeaderThree.h中。有任何想法吗?
%module Example
%{
#include "HeaderOne.h" //has constants and type definitions
#include "HeaderTwo.h" // has an #include "HeaderOne.h" and its own C apis
#include "HeaderThree.h" // has an #include "HeaderOne.h" and its own C apis
%}
%include "arrays_java.i"
int func(unsigned char key[20]);
%include "HeaderOne.h" //has constants and type definitions
%include "HeaderTwo.h" // has an #include "HeaderOne.h" and its own C apis
%include "HeaderThree.h" // has an #include "HeaderOne.h" and its own C apis
答案 0 :(得分:1)
这里的问题是,当你说%include
时,就好像你直接在那一点粘贴了文件的内容(即要求SWIG将它全部包装)。这意味着SWIG已经看到func
的两个版本,您明确告诉它的版本以及%include
d中标题中实际存在的版本。
有几种方法你可以解决这个问题,虽然额外的超负荷并没有造成任何伤害,但它只是嘈杂而且很乱。
使用func
在SWIG的头文件中隐藏#ifndef SWIG
的声明。您的头文件将变为:
#ifndef SWIG
int func(unsigned char *key);
#endif
当你%include
头文件SWIG看不到这个版本的func
时 - 这不是问题,因为你明确告诉它有关另一个版本(为了SWIG的目的兼容)
使用%ignore
指示SWIG专门忽略此版本的func
。然后SWIG模块文件变为:
%module Example
%{
#include "HeaderOne.h"
#include "HeaderTwo.h"
#include "HeaderThree.h"
%}
%include "arrays_java.i"
int func(unsigned char key[20]);
// This ignore directive only applies to things seen after this point
%ignore func;
%include "HeaderOne.h"
%include "HeaderTwo.h"
%include "HeaderThree.h"
您还可以更改标头文件中func
的实际声明和定义,以及在代码中实际实现的位置,以使用unsigned char[20]
代替unsigned char*
。< / p>