diff --git a/hal/src/main/native/cpp/jni/CANJNI.cpp b/hal/src/main/native/cpp/jni/CANJNI.cpp index 9375a06e80..53e344abdb 100644 --- a/hal/src/main/native/cpp/jni/CANJNI.cpp +++ b/hal/src/main/native/cpp/jni/CANJNI.cpp @@ -160,8 +160,15 @@ Java_edu_wpi_first_hal_can_CANJNI_readCANStreamSession JLocal elem{ env, static_cast(env->GetObjectArrayElement(messages, i))}; if (!elem) { - // TODO decide if should throw - continue; + // If element doesn't exist, construct it in place. If that fails, we are + // OOM, just return + elem = JLocal{env, CreateCANStreamMessage(env)}; + if (elem) { + std::printf("Allocated and set object\n"); + env->SetObjectArrayElement(messages, i, elem); + } else { + return 0; + } } JLocal toSetArray{ env, SetCANStreamObject(env, elem, msg->dataSize, msg->messageID, diff --git a/hal/src/main/native/cpp/jni/HALUtil.cpp b/hal/src/main/native/cpp/jni/HALUtil.cpp index 6316a8c1f8..3c7f04ce48 100644 --- a/hal/src/main/native/cpp/jni/HALUtil.cpp +++ b/hal/src/main/native/cpp/jni/HALUtil.cpp @@ -365,6 +365,12 @@ jobject CreatePowerDistributionVersion(JNIEnv* env, uint32_t firmwareMajor, static_cast(hardwareMajor), static_cast(uniqueId)); } +jobject CreateCANStreamMessage(JNIEnv* env) { + static jmethodID constructor = + env->GetMethodID(canStreamMessageCls, "", "()V"); + return env->NewObject(canStreamMessageCls, constructor); +} + JavaVM* GetJVM() { return jvm; } diff --git a/hal/src/main/native/cpp/jni/HALUtil.h b/hal/src/main/native/cpp/jni/HALUtil.h index 9c9487cd30..b3fdd31e87 100644 --- a/hal/src/main/native/cpp/jni/HALUtil.h +++ b/hal/src/main/native/cpp/jni/HALUtil.h @@ -93,6 +93,8 @@ jobject CreatePowerDistributionVersion(JNIEnv* env, uint32_t firmwareMajor, uint32_t hardwareMajor, uint32_t uniqueId); +jobject CreateCANStreamMessage(JNIEnv* env); + JavaVM* GetJVM(); } // namespace hal