Fix a bug in video_encoder_wrapper where int array was not freed properly.

JNI_COMMIT doesn't actually free the buffer.

From JNI docs:
0: copy back the content and free the elems buffer
JNI_COMMIT: copy back the content but do not free the elems buffer
JNI_ABORT: free the buffer without copying back the possible changes

Also introduces helper methods to help avoid this problem in the
future.

Bug: webrtc:10132
Change-Id: I769df286d3bd186fdf39ee2363e9002f36454509
Reviewed-on: https://webrtc-review.googlesource.com/c/120600
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26529}
This commit is contained in:
Sami Kalliomäki
2019-02-04 13:42:11 +01:00
committed by Commit Bot
parent eee110dea2
commit ee61f9440a
7 changed files with 110 additions and 21 deletions

View File

@ -206,6 +206,49 @@ ScopedJavaLocalRef<jstring> NativeToJavaString(
return str ? NativeToJavaString(jni, *str) : nullptr;
}
ScopedJavaLocalRef<jbyteArray> NativeToJavaByteArray(
JNIEnv* env,
rtc::ArrayView<int8_t> container) {
ScopedJavaLocalRef<jbyteArray> jarray(env,
env->NewByteArray(container.size()));
int8_t* array_ptr =
env->GetByteArrayElements(jarray.obj(), /*isCopy=*/nullptr);
memcpy(array_ptr, container.data(), container.size() * sizeof(int8_t));
env->ReleaseByteArrayElements(jarray.obj(), array_ptr, /*mode=*/0);
return jarray;
}
ScopedJavaLocalRef<jintArray> NativeToJavaIntArray(
JNIEnv* env,
rtc::ArrayView<int32_t> container) {
ScopedJavaLocalRef<jintArray> jarray(env, env->NewIntArray(container.size()));
int32_t* array_ptr =
env->GetIntArrayElements(jarray.obj(), /*isCopy=*/nullptr);
memcpy(array_ptr, container.data(), container.size() * sizeof(int32_t));
env->ReleaseIntArrayElements(jarray.obj(), array_ptr, /*mode=*/0);
return jarray;
}
std::vector<int8_t> JavaToNativeByteArray(JNIEnv* env,
const JavaRef<jbyteArray>& jarray) {
int8_t* array_ptr =
env->GetByteArrayElements(jarray.obj(), /*isCopy=*/nullptr);
size_t array_length = env->GetArrayLength(jarray.obj());
std::vector<int8_t> container(array_ptr, array_ptr + array_length);
env->ReleaseByteArrayElements(jarray.obj(), array_ptr, /*mode=*/JNI_ABORT);
return container;
}
std::vector<int32_t> JavaToNativeIntArray(JNIEnv* env,
const JavaRef<jintArray>& jarray) {
int32_t* array_ptr =
env->GetIntArrayElements(jarray.obj(), /*isCopy=*/nullptr);
size_t array_length = env->GetArrayLength(jarray.obj());
std::vector<int32_t> container(array_ptr, array_ptr + array_length);
env->ReleaseIntArrayElements(jarray.obj(), array_ptr, /*mode=*/JNI_ABORT);
return container;
}
ScopedJavaLocalRef<jobjectArray> NativeToJavaBooleanArray(
JNIEnv* env,
const std::vector<bool>& container) {

View File

@ -23,6 +23,7 @@
#include <vector>
#include "absl/types/optional.h"
#include "api/array_view.h"
#include "rtc_base/checks.h"
#include "rtc_base/thread_checker.h"
#include "sdk/android/native_api/jni/scoped_java_ref.h"
@ -220,6 +221,18 @@ ScopedJavaLocalRef<jobjectArray> NativeToJavaObjectArray(
return j_container;
}
ScopedJavaLocalRef<jbyteArray> NativeToJavaByteArray(
JNIEnv* env,
rtc::ArrayView<int8_t> container);
ScopedJavaLocalRef<jintArray> NativeToJavaIntArray(
JNIEnv* env,
rtc::ArrayView<int32_t> container);
std::vector<int8_t> JavaToNativeByteArray(JNIEnv* env,
const JavaRef<jbyteArray>& jarray);
std::vector<int32_t> JavaToNativeIntArray(JNIEnv* env,
const JavaRef<jintArray>& jarray);
ScopedJavaLocalRef<jobjectArray> NativeToJavaBooleanArray(
JNIEnv* env,
const std::vector<bool>& container);