SWIGs std_vector.i适用于一个文件,但不能同时适用于两个文件

时间:2014-03-19 00:10:24

标签: java android c++ swig

我在android中使用SWIG将一堆c ++代码转换为java。我有一个函数将从文件中读取数据,另一个函数将获取该数据并对其进行处理。两者都使用

vector<complex<float> >

问题是构建它会给我带来以下错误

[javac]         do_something_with_data.work(return_data.read(num_samps));
[javac]              ^
[javac]   required: SWIGTYPE_p_vectorT_complexT_float_t_t
[javac]   found: vector_complex_float
[javac]   reason: actual argument vector_complex_float cannot be converted to SWIGTYPE_p_vectorT_complexT_float_t_t by method invocation conversion
[javac] 1 error

我觉得有趣的是它适用于一个,但不适用于另一个。我做错了什么?

以下是.i文件

/* turn this module into java using SWIG */                                      
%module do_something_with_data                                                                 

%{                                                                               
#include <vector>                                                                
#include <complex>                                                               
#include "do_something_with_data.hh"                                               
%}                                                                               

/* Let's just grab the original header file here */                              
%include "std_vector.i"                                                          

namespace std {                                                                  
%template(vector_complex_float) vector<complex<float> >;                     
}                                                                                

/* boilerplate code */                                                           
%pragma(java) jniclasscode=%{                                                    
  static {                                                                       
    try {                                                                        
      java.lang.System.loadLibrary("do_something_with_data");                                  
    } catch (UnsatisfiedLinkError e) {                                           
      java.lang.System.err.println("Native code library failed to import");      
      java.lang.System.exit(1);                                                  
    }                                                                            
  }                                                                              
%}                                                                               

%include "do_something_with_data.hh"    

和另一个.i文件

/* turn this module into java using SWIG */                                      
%module return_data                                                                 

%{                                                                               
#include <vector>                                                                
#include <complex>                                                               
#include "return_data.hh"                                               
%}                                                                               

/* Let's just grab the original header file here */                              
%include "std_vector.i"                                                          

namespace std {                                                                  
%template(vector_complex_float) vector<complex<float> >;                     
}                                                                                

/* boilerplate code */                                                           
%pragma(java) jniclasscode=%{                                                    
  static {                                                                       
    try {                                                                        
      java.lang.System.loadLibrary("return_data");                                  
    } catch (UnsatisfiedLinkError e) {                                           
      java.lang.System.err.println("Native code library failed to import");      
      java.lang.System.exit(1);                                                  
    }                                                                            
  }                                                                              
%}                                                                               

%include "return_data.hh"    

我使用以下脚本编译两者

swig -c++ -java -package do_something_with_data -outdir src/do_something_with_data -o jni/do_something_with_data/do_something_with_data.cc jni/do_something_with_data/do_something_with_data.i
swig -c++ -java -package return_data            -outdir src/return_data            -o jni/return_data/return_data_wrap.cc                  jni/return_data/return_data.i

我知道我已经提供了很多代码,但是对我来说添加函数的定义也很重要。它们位于类声明中的.hh文件中。

int32 work(vector<complex<float> > &input_items);  

vector<complex<float> > read(int num_samps);   

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您需要告诉SWIG两个文件中的类是相同的。请参阅SWIG文档的File Imports部分,有关详细信息,请参阅第15节。在此处,do_something_with_data使用return_data,因此在%import "return_data.i"中添加do_something_with_data.i。此外,您不需要重新定义矢量模板。所以你的do_something_with_data.i应该是:

/* turn this module into java using SWIG */                                      
%module do_something_with_data                                                                 

%{                                                                               
#include <vector>                                                                
#include <complex>                                                               
#include "do_something_with_data.hh"                                               
%}                                                                               

%import "return_data.i"

/* boilerplate code */                                                           
%pragma(java) jniclasscode=%{                                                    
  static {                                                                       
    try {                                                                        
      java.lang.System.loadLibrary("do_something_with_data");                                  
    } catch (UnsatisfiedLinkError e) {                                           
      java.lang.System.err.println("Native code library failed to import");      
      java.lang.System.exit(1);                                                  
    }                                                                            
  }                                                                              
%}                                                                               

%include "do_something_with_data.hh"

答案 1 :(得分:0)

我问了两个主要问题。首先,为什么类型不同,其次,我如何让它们相互配合得很好。我设法解决了这两个问题。

首先,由于.i文件包含的头文件中缺少一行,因此类型不同。使用命名空间std;&#34;&#34;在所有包含的.hh文件中允许以下块工作。

namespace std {                                                                  
    %template(vector_complex_float) vector<complex<float> >;                     
}

上面回答了问题的第二部分,尽管我使用的方法略有不同。我创建了一个.i文件,其中包含了我感兴趣的所有软件包。这导致了以下代码:

/* turn this module into java using SWIG */
%module er_java

%{
    #include <vector>
    #include <complex>
    #include "read_data.hh"
    #include "do_something_with_data.hh"
%}

/* Let's just grab the original header file here */
%include "std_vector.i"
%include "std_string.i"

namespace std {
    %template(vector_complex_float) vector<complex<float> >;
    %template(vector_float) vector<float>;
}    

/* boilerplate code */
%pragma(java) jniclasscode=%{
  static {
    try {
      java.lang.System.loadLibrary("read_data");
      java.lang.System.loadLibrary("do_something_with_data");
    } catch (UnsatisfiedLinkError e) {
      java.lang.System.err.println("Native code library failed to import");
      java.lang.System.exit(1);
    }
  }
%}

%include "read_data/read_data.hh"
%include "do_something_with_data/do_something_with_data.hh"

并使用以下行构建所有内容

 swig -c++ -java -package er_java  -outdir src/er_java  -o jni/project/er_java_wrap.cc jni/swig_libs.i

不要忘记在项目的Android.mk中编译生成的wrap.cc文件