diff --git a/hal/src/main/native/cpp/jni/CANJNI.cpp b/hal/src/main/native/cpp/jni/CANJNI.cpp index 968f656634..d69786ed63 100644 --- a/hal/src/main/native/cpp/jni/CANJNI.cpp +++ b/hal/src/main/native/cpp/jni/CANJNI.cpp @@ -62,9 +62,7 @@ Java_edu_wpi_first_hal_can_CANJNI_FRCNetCommCANSessionMuxReceiveMessage if (!CheckCANStatus(env, status, *messageIDPtr)) { return nullptr; } - return MakeJByteArray(env, - std::string_view{reinterpret_cast(buffer), - static_cast(dataSize)}); + return MakeJByteArray(env, {buffer, static_cast(dataSize)}); } /* diff --git a/hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.cpp b/hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.cpp index 265b363e17..1b6ec94b55 100644 --- a/hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.cpp +++ b/hal/src/main/native/cpp/jni/simulation/BufferCallbackStore.cpp @@ -57,9 +57,8 @@ void BufferCallbackStore::performCallback(const char* name, uint8_t* buffer, std::fflush(stdout); } - auto toCallbackArr = MakeJByteArray( - env, std::string_view{reinterpret_cast(buffer), - static_cast(length)}); + auto toCallbackArr = + MakeJByteArray(env, {buffer, static_cast(length)}); env->CallVoidMethod(m_call, sim::GetBufferCallback(), MakeJString(env, name), toCallbackArr, static_cast(length)); diff --git a/hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.cpp b/hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.cpp index cba0a5b196..2cd652f59a 100644 --- a/hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.cpp +++ b/hal/src/main/native/cpp/jni/simulation/ConstBufferCallbackStore.cpp @@ -58,9 +58,8 @@ void ConstBufferCallbackStore::performCallback(const char* name, std::fflush(stdout); } - auto toCallbackArr = MakeJByteArray( - env, std::string_view{reinterpret_cast(buffer), - static_cast(length)}); + auto toCallbackArr = + MakeJByteArray(env, {buffer, static_cast(length)}); env->CallVoidMethod(m_call, sim::GetConstBufferCallback(), MakeJString(env, name), toCallbackArr, diff --git a/ntcore/src/main/native/cpp/jni/NetworkTablesJNI.cpp b/ntcore/src/main/native/cpp/jni/NetworkTablesJNI.cpp index 5cdf39177c..b83c0c3e1d 100644 --- a/ntcore/src/main/native/cpp/jni/NetworkTablesJNI.cpp +++ b/ntcore/src/main/native/cpp/jni/NetworkTablesJNI.cpp @@ -198,16 +198,22 @@ static jobject MakeJObject(JNIEnv* env, const nt::Value& value) { static_cast(value.GetDouble())); case NT_STRING: return MakeJString(env, value.GetString()); - case NT_RAW: - return MakeJByteArray(env, value.GetRaw()); + case NT_RAW: { + auto data = value.GetRaw(); + return MakeJByteArray( + env, {reinterpret_cast(data.data()), data.size()}); + } case NT_BOOLEAN_ARRAY: return MakeJBooleanArray(env, value.GetBooleanArray()); case NT_DOUBLE_ARRAY: return MakeJDoubleArray(env, value.GetDoubleArray()); case NT_STRING_ARRAY: return MakeJStringArray(env, value.GetStringArray()); - case NT_RPC: - return MakeJByteArray(env, value.GetRpc()); + case NT_RPC: { + auto data = value.GetRpc(); + return MakeJByteArray( + env, {reinterpret_cast(data.data()), data.size()}); + } default: return nullptr; } @@ -300,7 +306,10 @@ static jobject MakeJObject(JNIEnv* env, jobject inst, "NetworkTableInstance;IILjava/lang/String;[B" "Ledu/wpi/first/networktables/ConnectionInfo;)V"); JLocal name{env, MakeJString(env, answer.name)}; - JLocal params{env, MakeJByteArray(env, answer.params)}; + JLocal params{ + env, MakeJByteArray( + env, {reinterpret_cast(answer.params.data()), + answer.params.size()})}; JLocal conn{env, MakeJObject(env, answer.conn)}; return env->NewObject( rpcAnswerCls, constructor, inst, static_cast(answer.entry), @@ -736,7 +745,9 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_getRaw if (!val || !val->IsRaw()) { return defaultValue; } - return MakeJByteArray(env, val->GetRaw()); + auto data = val->GetRaw(); + return MakeJByteArray( + env, {reinterpret_cast(data.data()), data.size()}); } /* @@ -1359,7 +1370,8 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_getRpcResult__II if (!nt::GetRpcResult(entry, call, &result)) { return nullptr; } - return MakeJByteArray(env, result); + return MakeJByteArray( + env, {reinterpret_cast(result.data()), result.size()}); } /* @@ -1376,7 +1388,8 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_getRpcResult__IID if (!nt::GetRpcResult(entry, call, &result, timeout, &timed_out)) { return nullptr; } - return MakeJByteArray(env, result); + return MakeJByteArray( + env, {reinterpret_cast(result.data()), result.size()}); } /* @@ -1404,7 +1417,9 @@ Java_edu_wpi_first_networktables_NetworkTablesJNI_getRpc if (!val || !val->IsRpc()) { return defaultValue; } - return MakeJByteArray(env, val->GetRpc()); + auto data = val->GetRpc(); + return MakeJByteArray( + env, {reinterpret_cast(data.data()), data.size()}); } /* diff --git a/wpiutil/src/main/native/include/wpi/jni_util.h b/wpiutil/src/main/native/include/wpi/jni_util.h index 6042f893a9..6ee2626217 100644 --- a/wpiutil/src/main/native/include/wpi/jni_util.h +++ b/wpiutil/src/main/native/include/wpi/jni_util.h @@ -187,7 +187,8 @@ class JArrayRefInner { }; /** - * Specialization of JArrayRefBase to provide std::string_view conversion. + * Specialization of JArrayRefBase to provide std::string_view conversion + * and span conversion. */ template class JArrayRefInner { @@ -201,6 +202,14 @@ class JArrayRefInner { } return {reinterpret_cast(arr.data()), arr.size()}; } + + span uarray() const { + auto arr = static_cast(this)->array(); + if (arr.empty()) { + return {}; + } + return {reinterpret_cast(arr.data()), arr.size()}; + } }; /** @@ -484,12 +493,12 @@ inline jintArray MakeJIntArray(JNIEnv* env, const std::vector& arr) { } /** - * Convert a std::string_view into a jbyteArray. + * Convert a span into a jbyteArray. * * @param env JRE environment. - * @param str std::string_view to convert. + * @param str span to convert. */ -inline jbyteArray MakeJByteArray(JNIEnv* env, std::string_view str) { +inline jbyteArray MakeJByteArray(JNIEnv* env, span str) { jbyteArray jarr = env->NewByteArray(str.size()); if (!jarr) { return nullptr;