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

Jas*_*son 9 c++ java swig

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

例如,采用C++例程:

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

和Java代码:

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

我想对myMethod的调用无法像上面的调用一样......或者可以吗?并且Swig有必要使这项工作成功.如果我不能像上面那样打电话,我该如何获取C++代码的值?

Jas*_*son 8

使用carrays.i!

请参阅关于carrays的Swig文档

%include carrays.i
%array_functions( double, double_array )
Run Code Online (Sandbox Code Playgroud)

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

 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);
  }
Run Code Online (Sandbox Code Playgroud)

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

  • 这是最快的方式吗?我假设您需要使用Java数组中的元素数量调用SWIGTYPE_p_double,然后将每个项目复制到新数组,然后在新数组上执行C++处理,然后将每个项目复制回Java数组.有没有办法直接内存访问,只是在两种语言之间传递指针?或者由于Java和Cxx之间的内存管理不同,这些额外的复制操作是否是唯一的方法? (2认同)