From b05946175b8bbd1387eb2579530b69ba07cfa108 Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Fri, 1 Jan 2021 17:09:50 -0800 Subject: [PATCH] [wpimath] Catch Drake JNI exceptions and rethrow them (#3032) This gives an informative error in Java instead of crashing the JVM. --- .../src/main/native/cpp/jni/WPIMathJNI.cpp | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/wpimath/src/main/native/cpp/jni/WPIMathJNI.cpp b/wpimath/src/main/native/cpp/jni/WPIMathJNI.cpp index 8c81a26d59..18d887b63a 100644 --- a/wpimath/src/main/native/cpp/jni/WPIMathJNI.cpp +++ b/wpimath/src/main/native/cpp/jni/WPIMathJNI.cpp @@ -4,6 +4,8 @@ #include +#include + #include #include "Eigen/Core" @@ -71,15 +73,22 @@ Java_edu_wpi_first_math_WPIMathJNI_discreteAlgebraicRiccatiEquation Eigen::Matrix> Rmat{nativeR, inputs, inputs}; - Eigen::MatrixXd result = - drake::math::DiscreteAlgebraicRiccatiEquation(Amat, Bmat, Qmat, Rmat); + try { + Eigen::MatrixXd result = + drake::math::DiscreteAlgebraicRiccatiEquation(Amat, Bmat, Qmat, Rmat); - env->ReleaseDoubleArrayElements(A, nativeA, 0); - env->ReleaseDoubleArrayElements(B, nativeB, 0); - env->ReleaseDoubleArrayElements(Q, nativeQ, 0); - env->ReleaseDoubleArrayElements(R, nativeR, 0); + env->ReleaseDoubleArrayElements(A, nativeA, 0); + env->ReleaseDoubleArrayElements(B, nativeB, 0); + env->ReleaseDoubleArrayElements(Q, nativeQ, 0); + env->ReleaseDoubleArrayElements(R, nativeR, 0); - env->SetDoubleArrayRegion(S, 0, states * states, result.data()); + env->SetDoubleArrayRegion(S, 0, states * states, result.data()); + } catch (const std::runtime_error& e) { + jclass cls = env->FindClass("java/lang/RuntimeException"); + if (cls) { + env->ThrowNew(cls, e.what()); + } + } } /*