我在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);
提前感谢您的帮助。
答案 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文件