代码之家  ›  专栏  ›  技术社区  ›  Jason

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

  •  9
  • Jason  · 技术社区  · 15 年前

    我有一个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++代码中?

    4 回复  |  直到 15 年前
        1
  •  8
  •   Jason    15 年前

    用CARRIX!我!

    Swig docs on carrays

    %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);
      }
    

    它允许我在爪哇使用C数组…这解决了我的需求,是解决我的问题的最好办法。谢谢大家的回答!

        2
  •  1
  •   Andy Thomas    15 年前

    SWIG typemaps 应该允许这样做。swig 2.0文档显示了这一点 example in Python .

    使用Java,您可以在SWIG类型映射中使用JNI代码。JNI提供方法get/releasearrayelements。我猜你可以在 typemap(in) ,然后在 typemap(argout) .

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

        3
  •  0
  •   npinti    15 年前

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

    你可以退房 IPC's 还有文件。

    您可以做的另一件事是通过传递包含C++代码和数组作为参数的EXE路径来创建一个进程。[RunTime.Exc](JavaLang.Stand,java. Lang.Stule[])[2 ]应该能够做到这一点。

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

        4
  •  0
  •   Courtney Christensen    15 年前

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