使用Swig在C和java之间传递数组
我精通C,但不精通Java,我正在尝试使用Swig从Java调用C。简单的调用工作得很好,但我无法与carrays.I或arrays\u java.I方法交换数组。这两者都没有完整的例子 AMItest.i:使用Swig在C和java之间传递数组,java,c,arrays,swig,Java,C,Arrays,Swig,我精通C,但不精通Java,我正在尝试使用Swig从Java调用C。简单的调用工作得很好,但我无法与carrays.I或arrays\u java.I方法交换数组。这两者都没有完整的例子 AMItest.i: %module AMItest %{ #include "AMItest.h" %} %include "carrays.i" %include "AMItest.h" AMItest.h: extern int AMItest(double *Array, int Start, int
%module AMItest
%{
#include "AMItest.h"
%}
%include "carrays.i"
%include "AMItest.h"
AMItest.h:
extern int AMItest(double *Array, int Start, int End);
AMItest.c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include "AMItest.h"
int AMItest(double *Array, int Start, int End) {
if (End<=Start) {
fprintf(stderr, "Start must be lower than End\n");
return EDOM;
}
for (int i=0; i<=End-Start; i++)
Array[i]=sin(i/4.);
return 0;
}
谷歌搜索SWIGTYPE_p_*错误会导致几乎没有无用的链接。我还尝试过使用arrays\u java.I或将其添加到.I文件:
%array_functions( double, double )
%include <typemaps.i>
%apply (double *OUTPUT, int, int) {(double *Array, int Start, int End)};
这是我的.i文件还是Java文件的问题 调整你的测试。我喜欢这样:
%module AMItest
%{
#include "AMItest.h"
%}
%include "arrays_java.i"
%apply double[] {double *};
%include "AMItest.h"
有时C函数希望数组作为指针传递。。。
包装它的方法之一是应用arrays\u Java.i库文件中的Java数组类型映射。。。ANY size将确保typemap应用于所有大小的数组。通过指定特定的数组大小,可以缩小类型映射匹配规则的范围。现在可以使用纯Java数组并将其传递给C代码
请参阅此处的文档:
试验
使用所提供的示例和如上所示的修改后的AMItest.i,在调用java main时将获得以下输出:
更高效的大型阵列替代方案
对于由11个双元素组成的数组,您可能希望使用上面所示的方法。但我不想隐藏SWIG文档中显示的替代方法:
这种方法可能是使用数组最自然的方法。然而,当使用大量数组时,由于在从java世界向C++世界传递数组时发生大量元素复制,因此遇到了性能问题。将Java数组用于C数组的另一种方法是使用另一个SWIG库文件carrays.i。这种方法对于大型阵列更为有效,因为一次只能访问一个元素
您的示例需要在以下两个地方进行修改:
A.i:
%module AMItest
%{
#include "AMItest.h"
%}
%include "carrays.i"
%array_functions(double, doubleArray);
%include "AMItest.h"
您稍微修改的main.java将如下所示:
public class main {
public static void main(String argv[]) {
System.loadLibrary("AMItest_swig"); // File is libAMItest_swig.so
int size = 11;
SWIGTYPE_p_double myArray = AMItest.new_doubleArray(size);
AMItest.AMItest(myArray, 10, 20);
for (int i=0; i<size; i++)
System.out.print(AMItest.doubleArray_getitem(myArray, i) + " ");
}
}
结果是一样的 太棒了。但我必须说,即使阅读了文档,我也不太明白%apply double[]{double*}或%array_functions double,doubleArray实际做什么。
0
0.0 0.24740395925452294 0.479425538604203 0.6816387600233342 0.8414709848078965 0.9489846193555862 0.9974949866040544 0.9839859468739369 0.9092974268256817 0.7780731968879213 0.5984721441039564
%module AMItest
%{
#include "AMItest.h"
%}
%include "carrays.i"
%array_functions(double, doubleArray);
%include "AMItest.h"
public class main {
public static void main(String argv[]) {
System.loadLibrary("AMItest_swig"); // File is libAMItest_swig.so
int size = 11;
SWIGTYPE_p_double myArray = AMItest.new_doubleArray(size);
AMItest.AMItest(myArray, 10, 20);
for (int i=0; i<size; i++)
System.out.print(AMItest.doubleArray_getitem(myArray, i) + " ");
}
}