我需要将double
元素的一维和二维Java数组通过JNI分别转换为C / C ++中的ALGLIB real_1d_array
和real_2d_array
。现在,流程如下:
使用JNI GetDoubleArrayElements()
在C / C ++中获取jdouble
的连续向量。在我的机器上,这总是产生一个副本,即JNI将此调用的最后一个参数jboolean isCopy
设置为JNI_TRUE
。
分配double
的C / C ++向量,并将jdouble
的JNI向量中的元素复制到它。请注意,通常,不能保证jdouble
类型与double
类型相同,因此在逐个复制数组元素时需要强制转换为double
。 (在编译时或运行时,是否有一种干净的方法可以确定jdouble
确实与double
相同?)
分别实例化ALGLIB real_1d_array
或real_2d_array
。据我所知,从ALGLIB代码中,这会在数组内部保存ae_matrix
个维度(0,0)。
使用double
方法将数组元素从setcontent()
的C / C ++连续向量复制到ALGLIB数组。据我所知,从代码中可以适当地调整内部保持ae_matrix
的大小,并将元素逐个复制到该矩阵中。看起来在二维矩阵的情况下,第一维是指向double
的线性向量的指针的向量,因此元素非连续地存储在一维数组的数组中(类似于爪哇)。
使用ALGLIB使用真实数组执行所需的计算。
要通过JNI将结果复制回JAVA数组,请反转该过程。 ALGLIB实数组的元素只能通过方法访问。对于一维数组,有一个getcontent()
方法返回指向double
的连续向量的指针。对于二维数组,通过operator []
返回指向连续行的指针。和以前一样,使用带有强制转换为jdouble
的逐个元素副本。
如您所见,涉及大量复制。对于小型阵列,这不是什么大问题,但对于较大的阵列,这在内存和CPU方面相当昂贵。
有没有办法加快速度,而不依赖于ALGLIB内部结构的知识,这可能会有变化?