From 49572e3438c3108b84f8cca99039a9ca1e1d0d4b Mon Sep 17 00:00:00 2001 From: Magnus Jedvert Date: Tue, 28 Mar 2023 09:43:22 +0000 Subject: [PATCH] Add support for JavaToNativeFloatArray Change-Id: I75482debc163d2c5f173cad644cd25ceb2996b38 Bug: webrtc:15047 Change-Id: I75482debc163d2c5f173cad644cd25ceb2996b38 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/299240 Reviewed-by: Paulina Hensman Commit-Queue: Magnus Jedvert Cr-Commit-Position: refs/heads/main@{#39713} --- sdk/android/native_api/jni/java_types.cc | 15 +++++++++++++++ sdk/android/native_api/jni/java_types.h | 2 ++ 2 files changed, 17 insertions(+) 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,