如何使用Swig将数组从Java传递到C ++?

我在C ++中有一个方法,它接受一个双精度数组作为参数。 我从Java调用这个方法,需要传递一个双精度数组。 C ++例程读取并修改数组的值,我需要Java中的更新值。 我该怎么做呢?

例如,采用C ++例程:

void myMethod( double *values, int size ) { for ( int i=0; i < size; i++ ) { values[i] = 2*values[i]; } } 

和Java代码:

 double[] values = { 1.3, 1.1 }; myMethod(values,values.length); System.out.println(values[0]); // prints 2.6 

我想对myMethod的调用无法像上面的调用一样……或者可以吗? 而Swig有必要做到这一点。 如果我不能像上面那样打电话,我如何获得C ++代码的值?

使用carrays.i!

请参阅关于carrays的Swig文档

 %include carrays.i %array_functions( double, double_array ) 

这两行在我的模块中创建以下代码:

  public static SWIGTYPE_p_double new_double_array(int nelements) { long cPtr = SimulatorModuleJNI.new_double_array(nelements); return (cPtr == 0) ? null : new SWIGTYPE_p_double(cPtr, false); } public static void delete_double_array(SWIGTYPE_p_double ary) { SimulatorModuleJNI.delete_double_array(SWIGTYPE_p_double.getCPtr(ary)); } public static double double_array_getitem(SWIGTYPE_p_double ary, int index) { return SimulatorModuleJNI.double_array_getitem(SWIGTYPE_p_double.getCPtr(ary), index); } public static void double_array_setitem(SWIGTYPE_p_double ary, int index, double value) { SimulatorModuleJNI.double_array_setitem(SWIGTYPE_p_double.getCPtr(ary), index, value); } 

这允许我在Java中使用C数组…这解决了我的需求,是解决我的问题的最佳解决方案。 谢谢大家的回答!

SWIG类型图应该允许这样做。 SWIG 2.0文档在Python中显示了这个示例 。

使用Java,您可以在SWIG类型映射中使用JNI代码。 JNI提供方法Get / ReleaseArrayElements。 我猜你可以在一个typemap(in)获得一个本机数组,然后在一个typemap(argout)释放它。

另一种方法是使用std_vector.i中现有的SWIG类型映射将数组复制到std :: vector中。

假设你不能做org.life.java建议的……

您可以查看IPC和文件。

您可以做的另一件事是通过将包含C ++代码和数组作为参数的exe的路径传递给它来创建一个进程。 [Runtime.exec(java.lang.String,java.lang.String [])] [2]应该能够做到这一点。

[2]: http : //download.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec (java.lang.String,java.lang.String [])

如果只是单一方法,请重写它。 如果你有一个(更大)更大的C ++代码库,你需要移植,使用JNI (或更简单的JNA )。 这增加了相当多的代码开销,但它是可行的。