从Java阵列到JNI到ALGLIB实数组的高效转换

时间:2017-01-29 19:00:34

标签: java arrays java-native-interface alglib

我需要将double元素的一维和二维Java数组通过JNI分别转换为C / C ++中的ALGLIB real_1d_arrayreal_2d_array。现在,流程如下:

  1. 使用JNI GetDoubleArrayElements()在C / C ++中获取jdouble的连续向量。在我的机器上,这总是产生一个副本,即JNI将此调用的最后一个参数jboolean isCopy设置为JNI_TRUE

  2. 分配double的C / C ++向量,并将jdouble的JNI向量中的元素复制到它。请注意,通常,不能保证jdouble类型与double类型相同,因此在逐个复制数组元素时需要强制转换为double。 (在编译时或运行时,是否有一种干净的方法可以确定jdouble确实与double相同?)

  3. 分别实例化ALGLIB real_1d_arrayreal_2d_array。据我所知,从ALGLIB代码中,这会在数组内部保存ae_matrix个维度(0,0)。

  4. 使用double方法将数组元素从setcontent()的C / C ++连续向量复制到ALGLIB数组。据我所知,从代码中可以适当地调整内部保持ae_matrix的大小,并将元素逐个复制到该矩阵中。看起来在二维矩阵的情况下,第一维是指向double的线性向量的指针的向量,因此元素非连续地存储在一维数组的数组中(类似于爪哇)。

  5. 使用ALGLIB使用真实数组执行所需的计算。

  6. 要通过JNI将结果复制回JAVA数组,请反转该过程。 ALGLIB实数组的元素只能通过方法访问。对于一维数组,有一个getcontent()方法返回指向double的连续向量的指针。对于二维数组,通过operator []返回指向连续行的指针。和以前一样,使用带有强制转换为jdouble的逐个元素副本。

  7. 如您所见,涉及大量复制。对于小型阵列,这不是什么大问题,但对于较大的阵列,这在内存和CPU方面相当昂贵。

    有没有办法加快速度,而不依赖于ALGLIB内部结构的知识,这可能会有变化?

0 个答案:

没有答案