Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Swig在C和java之间传递数组_Java_C_Arrays_Swig - Fatal编程技术网

使用Swig在C和java之间传递数组

使用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

我精通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 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) + " ");
    }
}