我在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 ++代码的值?
答案 0 :(得分:8)
使用carrays.i!
%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数组...这解决了我的需求,是解决我的问题的最佳解决方案。谢谢大家的回答!
答案 1 :(得分:1)
SWIG typemaps应该允许这样做。 SWIG 2.0文档显示了此example in Python。
使用Java,您可以在SWIG typemap中使用JNI代码。 JNI提供方法Get / ReleaseArrayElements。我猜你可以在typemap(in)
中获得原生数组,然后在typemap(argout)
中释放它。
另一种方法是使用std_vector.i中现有的SWIG类型映射将数组复制到std :: vector中。
答案 2 :(得分:0)
假设你不能做org.life.java建议......
您可以查看IPC's以及文件。
您可以做的另一件事是通过将包含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 [])
答案 3 :(得分:0)