diff --git a/wpiutil/src/main/native/include/wpi/jni_util.h b/wpiutil/src/main/native/include/wpi/jni_util.h index 469dd0ea91..e56418d192 100644 --- a/wpiutil/src/main/native/include/wpi/jni_util.h +++ b/wpiutil/src/main/native/include/wpi/jni_util.h @@ -223,13 +223,16 @@ class JArrayRefBase : public JArrayRefInner, T> { this->m_elements = elements; } - JArrayRefBase(JNIEnv* env, jarray jarr) { + JArrayRefBase(JNIEnv* env, jarray jarr, size_t size) { this->m_env = env; this->m_jarr = jarr; - this->m_size = jarr ? env->GetArrayLength(jarr) : 0; + this->m_size = size; this->m_elements = nullptr; } + JArrayRefBase(JNIEnv* env, jarray jarr) + : JArrayRefBase(env, jarr, jarr ? env->GetArrayLength(jarr) : 0) {} + JNIEnv* m_env; jarray m_jarr = nullptr; size_t m_size; @@ -252,6 +255,14 @@ class JArrayRefBase : public JArrayRefInner, T> { errs() << "JArrayRef was passed a null pointer at \n" \ << GetJavaStackTrace(env); \ } \ + J##F##ArrayRef(JNIEnv* env, T##Array jarr, int len) \ + : detail::JArrayRefBase(env, jarr, len) { \ + if (jarr) \ + m_elements = env->Get##F##ArrayElements(jarr, nullptr); \ + else \ + errs() << "JArrayRef was passed a null pointer at \n" \ + << GetJavaStackTrace(env); \ + } \ J##F##ArrayRef(JNIEnv* env, T##Array jarr) \ : detail::JArrayRefBase(env, jarr) { \ if (jarr) \ @@ -269,6 +280,15 @@ class JArrayRefBase : public JArrayRefInner, T> { \ class CriticalJ##F##ArrayRef : public detail::JArrayRefBase { \ public: \ + CriticalJ##F##ArrayRef(JNIEnv* env, T##Array jarr, int len) \ + : detail::JArrayRefBase(env, jarr, len) { \ + if (jarr) \ + m_elements = \ + static_cast(env->GetPrimitiveArrayCritical(jarr, nullptr)); \ + else \ + errs() << "JArrayRef was passed a null pointer at \n" \ + << GetJavaStackTrace(env); \ + } \ CriticalJ##F##ArrayRef(JNIEnv* env, T##Array jarr) \ : detail::JArrayRefBase(env, jarr) { \ if (jarr) \