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