diff --git a/sdk/android/native_api/jni/java_types.cc b/sdk/android/native_api/jni/java_types.cc index 24f247e73b..87406d15c4 100644 --- a/sdk/android/native_api/jni/java_types.cc +++ b/sdk/android/native_api/jni/java_types.cc @@ -265,6 +265,21 @@ std::vector JavaToNativeIntArray(JNIEnv* env, return container; } +std::vector JavaToNativeFloatArray(JNIEnv* env, + const JavaRef& jarray) { + // jfloat is a "machine-dependent native type" which represents a 32-bit + // float. C++ makes no guarantees about the size of floating point types, and + // some exotic architectures don't even have 32-bit floats (or even binary + // floats), but on all architectures we care about this is a float. + static_assert(std::is_same::value, "jfloat must be float"); + float* array_ptr = + env->GetFloatArrayElements(jarray.obj(), /*isCopy=*/nullptr); + size_t array_length = env->GetArrayLength(jarray.obj()); + std::vector container(array_ptr, array_ptr + array_length); + env->ReleaseFloatArrayElements(jarray.obj(), array_ptr, /*mode=*/JNI_ABORT); + return container; +} + ScopedJavaLocalRef NativeToJavaBooleanArray( JNIEnv* env, const std::vector& container) { diff --git a/sdk/android/native_api/jni/java_types.h b/sdk/android/native_api/jni/java_types.h index 556c5e44ca..44ade0d06e 100644 --- a/sdk/android/native_api/jni/java_types.h +++ b/sdk/android/native_api/jni/java_types.h @@ -242,6 +242,8 @@ std::vector JavaToNativeByteArray(JNIEnv* env, const JavaRef& jarray); std::vector JavaToNativeIntArray(JNIEnv* env, const JavaRef& jarray); +std::vector JavaToNativeFloatArray(JNIEnv* env, + const JavaRef& jarray); ScopedJavaLocalRef NativeToJavaBooleanArray( JNIEnv* env,