SWIG接口文件结构导致重复的Java函数

时间:2011-11-30 01:50:48

标签: swig

我有以下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

1 个答案:

答案 0 :(得分:1)

这里的问题是,当你说%include时,就好像你直接在那一点粘贴了文件的内容(即要求SWIG将它全部包装)。这意味着SWIG已经看到func的两个版本,您明确告诉它的版本以及%include d中标题中实际存在的版本。

有几种方法你可以解决这个问题,虽然额外的超负荷并没有造成任何伤害,但它只是嘈杂而且很乱。

  1. 使用func在SWIG的头文件中隐藏#ifndef SWIG的声明。您的头文件将变为:

    #ifndef SWIG
    int func(unsigned char *key);
    #endif
    

    当你%include头文件SWIG看不到这个版本的func时 - 这不是问题,因为你明确告诉它有关另一个版本(为了SWIG的目的兼容)

  2. 使用%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"
    
  3. 您还可以更改标头文件中func的实际声明和定义,以及在代码中实际实现的位置,以使用unsigned char[20]代替unsigned char*。< / p>