diff --git a/wpimath/src/main/native/cpp/jni/WPIMathJNI.cpp b/wpimath/src/main/native/cpp/jni/WPIMathJNI.cpp index 66471f7097..e1d3af820a 100644 --- a/wpimath/src/main/native/cpp/jni/WPIMathJNI.cpp +++ b/wpimath/src/main/native/cpp/jni/WPIMathJNI.cpp @@ -235,15 +235,14 @@ JNIEXPORT void JNICALL Java_edu_wpi_first_math_WPIMathJNI_exp (JNIEnv* env, jclass, jdoubleArray src, jint rows, jdoubleArray dst) { - jdouble* arrayBody = env->GetDoubleArrayElements(src, nullptr); + JDoubleArrayRef arrayBody{env, src}; - Eigen::Map< - Eigen::Matrix> - Amat{arrayBody, rows, rows}; + Eigen::Map> + Amat{arrayBody.array().data(), rows, rows}; Eigen::Matrix Aexp = Amat.exp(); - env->ReleaseDoubleArrayElements(src, arrayBody, 0); env->SetDoubleArrayRegion(dst, 0, rows * rows, Aexp.data()); } @@ -257,15 +256,14 @@ Java_edu_wpi_first_math_WPIMathJNI_pow (JNIEnv* env, jclass, jdoubleArray src, jint rows, jdouble exponent, jdoubleArray dst) { - jdouble* arrayBody = env->GetDoubleArrayElements(src, nullptr); + JDoubleArrayRef arrayBody{env, src}; - Eigen::Map< - Eigen::Matrix> - Amat{arrayBody, rows, rows}; // NOLINT + Eigen::Map> + Amat{arrayBody.array().data(), rows, rows}; // NOLINT Eigen::Matrix Apow = Amat.pow(exponent); - env->ReleaseDoubleArrayElements(src, arrayBody, 0); env->SetDoubleArrayRegion(dst, 0, rows * rows, Apow.data()); } @@ -333,23 +331,20 @@ Java_edu_wpi_first_math_WPIMathJNI_isStabilizable (JNIEnv* env, jclass, jint states, jint inputs, jdoubleArray aSrc, jdoubleArray bSrc) { - jdouble* nativeA = env->GetDoubleArrayElements(aSrc, nullptr); - jdouble* nativeB = env->GetDoubleArrayElements(bSrc, nullptr); + JDoubleArrayRef nativeA{env, aSrc}; + JDoubleArrayRef nativeB{env, bSrc}; - Eigen::Map< - Eigen::Matrix> - A{nativeA, states, states}; + Eigen::Map> + A{nativeA.array().data(), states, states}; - Eigen::Map< - Eigen::Matrix> - B{nativeB, states, inputs}; + Eigen::Map> + B{nativeB.array().data(), states, inputs}; bool isStabilizable = frc::IsStabilizable(A, B); - env->ReleaseDoubleArrayElements(aSrc, nativeA, 0); - env->ReleaseDoubleArrayElements(bSrc, nativeB, 0); - return isStabilizable; } @@ -458,13 +453,15 @@ Java_edu_wpi_first_math_WPIMathJNI_rankUpdate (JNIEnv* env, jclass, jdoubleArray mat, jint rows, jdoubleArray vec, jdouble sigma, jboolean lowerTriangular) { + // TODO: Replace with JSpan matBody{env, mat} when that exists jdouble* matBody = env->GetDoubleArrayElements(mat, nullptr); - jdouble* vecBody = env->GetDoubleArrayElements(vec, nullptr); + JDoubleArrayRef vecBody{env, vec}; Eigen::Map< Eigen::Matrix> L{matBody, rows, rows}; - Eigen::Map> v{vecBody, rows}; + Eigen::Map> v{ + vecBody.array().data(), rows}; if (lowerTriangular == JNI_TRUE) { Eigen::internal::llt_inplace::rankUpdate(L, v, sigma); @@ -472,8 +469,8 @@ Java_edu_wpi_first_math_WPIMathJNI_rankUpdate Eigen::internal::llt_inplace::rankUpdate(L, v, sigma); } + // TODO: Remove this after JSpan transition env->ReleaseDoubleArrayElements(mat, matBody, 0); - env->ReleaseDoubleArrayElements(vec, vecBody, 0); } /* @@ -486,21 +483,19 @@ Java_edu_wpi_first_math_WPIMathJNI_solveFullPivHouseholderQr (JNIEnv* env, jclass, jdoubleArray A, jint Arows, jint Acols, jdoubleArray B, jint Brows, jint Bcols, jdoubleArray dst) { - jdouble* nativeA = env->GetDoubleArrayElements(A, nullptr); - jdouble* nativeB = env->GetDoubleArrayElements(B, nullptr); + JDoubleArrayRef nativeA{env, A}; + JDoubleArrayRef nativeB{env, B}; - Eigen::Map< - Eigen::Matrix> - Amat{nativeA, Arows, Acols}; - Eigen::Map< - Eigen::Matrix> - Bmat{nativeB, Brows, Bcols}; + Eigen::Map> + Amat{nativeA.array().data(), Arows, Acols}; + Eigen::Map> + Bmat{nativeB.array().data(), Brows, Bcols}; Eigen::Matrix Xmat = Amat.fullPivHouseholderQr().solve(Bmat); - env->ReleaseDoubleArrayElements(A, nativeA, 0); - env->ReleaseDoubleArrayElements(B, nativeB, 0); env->SetDoubleArrayRegion(dst, 0, Brows * Bcols, Xmat.data()); }