diff --git a/src/corelib/kernel/qjniarray.h b/src/corelib/kernel/qjniarray.h index 25036f18bb8..01598f2fa0a 100644 --- a/src/corelib/kernel/qjniarray.h +++ b/src/corelib/kernel/qjniarray.h @@ -11,8 +11,9 @@ #include #include -#include +#include #include +#include #if defined(Q_QDOC) using jsize = qint32; @@ -479,9 +480,8 @@ public: template = true> static auto fromContainer(Container &&container) { - Q_ASSERT_X(size_t(std::size(container)) <= size_t((std::numeric_limits::max)()), - "QJniArray::fromContainer", "Container is too large for a Java array"); - + if (!q20::in_range(std::size(container))) + qWarning("QJniArray::fromContainer: Container is too large for Java and will be truncated!"); using ElementType = typename std::remove_reference_t::value_type; if constexpr (std::is_base_of_v, std::remove_pointer_t>) { @@ -915,7 +915,7 @@ auto QJniArrayBase::makeObjectArray(List &&list) return ResultType(); JNIEnv *env = QJniEnvironment::getJniEnv(); - const size_type length = size_type(std::size(list)); + const size_type length = q26::saturate_cast(std::size(list)); // this assumes that all objects in the list have the same class jclass elementClass = nullptr; diff --git a/src/corelib/kernel/qjnitypes_impl.h b/src/corelib/kernel/qjnitypes_impl.h index a5ce38d1a8c..6e1ba45db83 100644 --- a/src/corelib/kernel/qjnitypes_impl.h +++ b/src/corelib/kernel/qjnitypes_impl.h @@ -5,7 +5,10 @@ #define QJNITYPES_IMPL_H #include + +#include #include +#include #if defined(Q_QDOC) || defined(Q_OS_ANDROID) #include @@ -19,7 +22,10 @@ namespace Detail { static inline jstring fromQString(const QString &string, JNIEnv *env) { - return env->NewString(reinterpret_cast(string.constData()), string.length()); + if (!q20::in_range(string.size())) + qWarning("String is too large for a Java string and will be truncated"); + const jsize length = q26::saturate_cast(string.size()); + return env->NewString(reinterpret_cast(string.constData()), length); } static inline QString toQString(jstring string, JNIEnv *env)