From dff310227deaea07a6428caa0df40d3fed2f92b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20Kalliom=C3=A4ki?= Date: Thu, 1 Feb 2018 13:21:15 +0100 Subject: [PATCH] Reorganize code in java_types to logical groups. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reorganizes methods in java_types.h to logical groups. The order in the source file matches the order in the header file. Bug: webrtc:8769 Change-Id: Id3e1e80276a747a3d9952598207ac55493ac46b6 Reviewed-on: https://webrtc-review.googlesource.com/46146 Commit-Queue: Sami Kalliomäki Reviewed-by: Anders Carlsson Cr-Commit-Position: refs/heads/master@{#21842} --- sdk/android/native_api/jni/java_types.cc | 226 +++++++++++------------ sdk/android/native_api/jni/java_types.h | 161 +++++++++------- 2 files changed, 206 insertions(+), 181 deletions(-) diff --git a/sdk/android/native_api/jni/java_types.cc b/sdk/android/native_api/jni/java_types.cc index 74d1ddb3bc..156925c48f 100644 --- a/sdk/android/native_api/jni/java_types.cc +++ b/sdk/android/native_api/jni/java_types.cc @@ -27,107 +27,6 @@ namespace webrtc { -bool IsNull(JNIEnv* jni, const JavaRef& obj) { - return jni->IsSameObject(obj.obj(), nullptr); -} - -// Given a jstring, reinterprets it to a new native string. -std::string JavaToStdString(JNIEnv* jni, const JavaRef& j_string) { - const ScopedJavaLocalRef j_byte_array = - Java_JniHelper_getStringBytes(jni, j_string); - - const size_t len = jni->GetArrayLength(j_byte_array.obj()); - CHECK_EXCEPTION(jni) << "error during GetArrayLength"; - std::string str(len, '\0'); - jni->GetByteArrayRegion(j_byte_array.obj(), 0, len, - reinterpret_cast(&str[0])); - CHECK_EXCEPTION(jni) << "error during GetByteArrayRegion"; - return str; -} - -// Given a list of jstrings, reinterprets it to a new vector of native strings. -std::vector JavaToStdVectorStrings(JNIEnv* jni, - const JavaRef& list) { - std::vector converted_list; - if (!list.is_null()) { - for (const JavaRef& str : Iterable(jni, list)) { - converted_list.push_back(JavaToStdString( - jni, JavaParamRef(static_cast(str.obj())))); - } - } - return converted_list; -} - -rtc::Optional JavaToNativeOptionalInt( - JNIEnv* jni, - const JavaRef& integer) { - if (IsNull(jni, integer)) - return rtc::nullopt; - return JNI_Integer::Java_Integer_intValue(jni, integer); -} - -rtc::Optional JavaToNativeOptionalBool(JNIEnv* jni, - const JavaRef& boolean) { - if (IsNull(jni, boolean)) - return rtc::nullopt; - return JNI_Boolean::Java_Boolean_booleanValue(jni, boolean); -} - -int64_t JavaToNativeLong(JNIEnv* env, const JavaRef& j_long) { - return JNI_Long::Java_Long_longValue(env, j_long); -} - -ScopedJavaLocalRef NativeToJavaBoolean(JNIEnv* env, bool b) { - return JNI_Boolean::Java_Boolean_ConstructorJLB_Z(env, b); -} - -ScopedJavaLocalRef NativeToJavaInteger(JNIEnv* jni, int32_t i) { - return JNI_Integer::Java_Integer_ConstructorJLI_I(jni, i); -} - -ScopedJavaLocalRef NativeToJavaLong(JNIEnv* env, int64_t u) { - return JNI_Long::Java_Long_ConstructorJLLO_J(env, u); -} - -ScopedJavaLocalRef NativeToJavaDouble(JNIEnv* env, double d) { - return JNI_Double::Java_Double_ConstructorJLD_D(env, d); -} - -ScopedJavaLocalRef NativeToJavaString(JNIEnv* env, const char* str) { - jstring j_str = env->NewStringUTF(str); - CHECK_EXCEPTION(env) << "error during NewStringUTF"; - return ScopedJavaLocalRef(env, j_str); -} - -ScopedJavaLocalRef NativeToJavaString(JNIEnv* jni, - const std::string& str) { - return NativeToJavaString(jni, str.c_str()); -} - -ScopedJavaLocalRef NativeToJavaInteger( - JNIEnv* jni, - const rtc::Optional& optional_int) { - return optional_int ? NativeToJavaInteger(jni, *optional_int) : nullptr; -} - -std::string GetJavaEnumName(JNIEnv* jni, const JavaRef& j_enum) { - return JavaToStdString(jni, JNI_Enum::Java_Enum_name(jni, j_enum)); -} - -std::map JavaToStdMapStrings( - JNIEnv* jni, - const JavaRef& j_map) { - const JavaRef& j_entry_set = JNI_Map::Java_Map_entrySet(jni, j_map); - std::map result; - for (const JavaRef& j_entry : Iterable(jni, j_entry_set)) { - result.insert(std::make_pair( - JavaToStdString(jni, Java_JniHelper_getKey(jni, j_entry)), - JavaToStdString(jni, Java_JniHelper_getValue(jni, j_entry)))); - } - - return result; -} - Iterable::Iterable(JNIEnv* jni, const JavaRef& iterable) : jni_(jni), iterable_(jni, iterable) {} @@ -196,13 +95,78 @@ bool Iterable::Iterator::AtEnd() const { return jni_ == nullptr || IsNull(jni_, iterator_); } -ScopedJavaLocalRef NativeToJavaIntegerArray( - JNIEnv* env, - const std::vector& container) { - ScopedJavaLocalRef (*convert_function)(JNIEnv*, int32_t) = - &NativeToJavaInteger; - return NativeToJavaObjectArray(env, container, java_lang_Integer_clazz(env), - convert_function); +bool IsNull(JNIEnv* jni, const JavaRef& obj) { + return jni->IsSameObject(obj.obj(), nullptr); +} + +std::string GetJavaEnumName(JNIEnv* jni, const JavaRef& j_enum) { + return JavaToStdString(jni, JNI_Enum::Java_Enum_name(jni, j_enum)); +} + +int64_t JavaToNativeLong(JNIEnv* env, const JavaRef& j_long) { + return JNI_Long::Java_Long_longValue(env, j_long); +} + +rtc::Optional JavaToNativeOptionalBool(JNIEnv* jni, + const JavaRef& boolean) { + if (IsNull(jni, boolean)) + return rtc::nullopt; + return JNI_Boolean::Java_Boolean_booleanValue(jni, boolean); +} + +rtc::Optional JavaToNativeOptionalInt( + JNIEnv* jni, + const JavaRef& integer) { + if (IsNull(jni, integer)) + return rtc::nullopt; + return JNI_Integer::Java_Integer_intValue(jni, integer); +} + +// Given a jstring, reinterprets it to a new native string. +std::string JavaToNativeString(JNIEnv* jni, const JavaRef& j_string) { + const ScopedJavaLocalRef j_byte_array = + Java_JniHelper_getStringBytes(jni, j_string); + + const size_t len = jni->GetArrayLength(j_byte_array.obj()); + CHECK_EXCEPTION(jni) << "error during GetArrayLength"; + std::string str(len, '\0'); + jni->GetByteArrayRegion(j_byte_array.obj(), 0, len, + reinterpret_cast(&str[0])); + CHECK_EXCEPTION(jni) << "error during GetByteArrayRegion"; + return str; +} + +ScopedJavaLocalRef NativeToJavaBoolean(JNIEnv* env, bool b) { + return JNI_Boolean::Java_Boolean_ConstructorJLB_Z(env, b); +} + +ScopedJavaLocalRef NativeToJavaDouble(JNIEnv* env, double d) { + return JNI_Double::Java_Double_ConstructorJLD_D(env, d); +} + +ScopedJavaLocalRef NativeToJavaInteger(JNIEnv* jni, int32_t i) { + return JNI_Integer::Java_Integer_ConstructorJLI_I(jni, i); +} + +ScopedJavaLocalRef NativeToJavaLong(JNIEnv* env, int64_t u) { + return JNI_Long::Java_Long_ConstructorJLLO_J(env, u); +} + +ScopedJavaLocalRef NativeToJavaString(JNIEnv* env, const char* str) { + jstring j_str = env->NewStringUTF(str); + CHECK_EXCEPTION(env) << "error during NewStringUTF"; + return ScopedJavaLocalRef(env, j_str); +} + +ScopedJavaLocalRef NativeToJavaString(JNIEnv* jni, + const std::string& str) { + return NativeToJavaString(jni, str.c_str()); +} + +ScopedJavaLocalRef NativeToJavaInteger( + JNIEnv* jni, + const rtc::Optional& optional_int) { + return optional_int ? NativeToJavaInteger(jni, *optional_int) : nullptr; } ScopedJavaLocalRef NativeToJavaBooleanArray( @@ -219,6 +183,15 @@ ScopedJavaLocalRef NativeToJavaDoubleArray( &NativeToJavaDouble); } +ScopedJavaLocalRef NativeToJavaIntegerArray( + JNIEnv* env, + const std::vector& container) { + ScopedJavaLocalRef (*convert_function)(JNIEnv*, int32_t) = + &NativeToJavaInteger; + return NativeToJavaObjectArray(env, container, java_lang_Integer_clazz(env), + convert_function); +} + ScopedJavaLocalRef NativeToJavaLongArray( JNIEnv* env, const std::vector& container) { @@ -236,6 +209,15 @@ ScopedJavaLocalRef NativeToJavaStringArray( static_cast(Java_JniHelper_getStringClass(env).obj()), convert); } +JavaListBuilder::JavaListBuilder(JNIEnv* env) + : env_(env), j_list_(JNI_ArrayList::Java_ArrayList_ConstructorJUALI(env)) {} + +JavaListBuilder::~JavaListBuilder() = default; + +void JavaListBuilder::add(const JavaRef& element) { + JNI_ArrayList::Java_ArrayList_addZ_JUE(env_, j_list_, element); +} + JavaMapBuilder::JavaMapBuilder(JNIEnv* env) : env_(env), j_map_(JNI_LinkedHashMap::Java_LinkedHashMap_ConstructorJULIHM(env)) {} @@ -247,13 +229,31 @@ void JavaMapBuilder::put(const JavaRef& key, JNI_Map::Java_Map_put(env_, j_map_, key, value); } -JavaListBuilder::JavaListBuilder(JNIEnv* env) - : env_(env), j_list_(JNI_ArrayList::Java_ArrayList_ConstructorJUALI(env)) {} +// Given a list of jstrings, reinterprets it to a new vector of native strings. +std::vector JavaToStdVectorStrings(JNIEnv* jni, + const JavaRef& list) { + std::vector converted_list; + if (!list.is_null()) { + for (const JavaRef& str : Iterable(jni, list)) { + converted_list.push_back(JavaToStdString( + jni, JavaParamRef(static_cast(str.obj())))); + } + } + return converted_list; +} -JavaListBuilder::~JavaListBuilder() = default; +std::map JavaToStdMapStrings( + JNIEnv* jni, + const JavaRef& j_map) { + const JavaRef& j_entry_set = JNI_Map::Java_Map_entrySet(jni, j_map); + std::map result; + for (const JavaRef& j_entry : Iterable(jni, j_entry_set)) { + result.insert(std::make_pair( + JavaToStdString(jni, Java_JniHelper_getKey(jni, j_entry)), + JavaToStdString(jni, Java_JniHelper_getValue(jni, j_entry)))); + } -void JavaListBuilder::add(const JavaRef& element) { - JNI_ArrayList::Java_ArrayList_addZ_JUE(env_, j_list_, element); + return result; } } // namespace webrtc diff --git a/sdk/android/native_api/jni/java_types.h b/sdk/android/native_api/jni/java_types.h index bd9e70008f..2f5e8f84f3 100644 --- a/sdk/android/native_api/jni/java_types.h +++ b/sdk/android/native_api/jni/java_types.h @@ -37,52 +37,9 @@ namespace webrtc { -// Returns true if |obj| == null in Java. -bool IsNull(JNIEnv* jni, const JavaRef& obj); - -// Given a (UTF-16) jstring return a new UTF-8 native string. -std::string JavaToStdString(JNIEnv* jni, const JavaRef& j_string); - -// Deprecated. Use scoped jobjects instead. -inline std::string JavaToStdString(JNIEnv* jni, jstring j_string) { - return JavaToStdString(jni, JavaParamRef(j_string)); -} - -// Given a List of (UTF-16) jstrings -// return a new vector of UTF-8 native strings. -std::vector JavaToStdVectorStrings(JNIEnv* jni, - const JavaRef& list); - -rtc::Optional JavaToNativeOptionalInt(JNIEnv* jni, - const JavaRef& integer); -rtc::Optional JavaToNativeOptionalBool(JNIEnv* jni, - const JavaRef& boolean); -int64_t JavaToNativeLong(JNIEnv* env, const JavaRef& j_long); - -ScopedJavaLocalRef NativeToJavaBoolean(JNIEnv* env, bool b); -ScopedJavaLocalRef NativeToJavaInteger(JNIEnv* jni, int32_t i); -ScopedJavaLocalRef NativeToJavaLong(JNIEnv* env, int64_t u); -ScopedJavaLocalRef NativeToJavaDouble(JNIEnv* env, double d); -ScopedJavaLocalRef NativeToJavaString(JNIEnv* jni, const char* str); -ScopedJavaLocalRef NativeToJavaString(JNIEnv* jni, - const std::string& str); -ScopedJavaLocalRef NativeToJavaInteger( - JNIEnv* jni, - const rtc::Optional& optional_int); - -// Parses Map to std::map. -std::map JavaToStdMapStrings( - JNIEnv* jni, - const JavaRef& j_map); - -// Deprecated. Use scoped jobjects instead. -inline std::map JavaToStdMapStrings(JNIEnv* jni, - jobject j_map) { - return JavaToStdMapStrings(jni, JavaParamRef(j_map)); -} - -// Returns the name of a Java enum. -std::string GetJavaEnumName(JNIEnv* jni, const JavaRef& j_enum); +// --------------- +// -- Utilities -- +// --------------- // Provides a convenient way to iterate over a Java Iterable using the // C++ range-for loop. @@ -148,6 +105,58 @@ class Iterable { RTC_DISALLOW_COPY_AND_ASSIGN(Iterable); }; +// Returns true if |obj| == null in Java. +bool IsNull(JNIEnv* jni, const JavaRef& obj); + +// Returns the name of a Java enum. +std::string GetJavaEnumName(JNIEnv* jni, const JavaRef& j_enum); + +// -------------------------------------------------------- +// -- Methods for converting Java types to native types. -- +// -------------------------------------------------------- + +int64_t JavaToNativeLong(JNIEnv* env, const JavaRef& j_long); + +rtc::Optional JavaToNativeOptionalBool(JNIEnv* jni, + const JavaRef& boolean); +rtc::Optional JavaToNativeOptionalInt(JNIEnv* jni, + const JavaRef& integer); + +// Given a (UTF-16) jstring return a new UTF-8 native string. +std::string JavaToNativeString(JNIEnv* jni, const JavaRef& j_string); + +template +std::vector JavaToNativeVector(JNIEnv* env, + const JavaRef& j_container, + Convert convert) { + std::vector container; + const size_t size = env->GetArrayLength(j_container.obj()); + container.reserve(size); + for (size_t i = 0; i < size; ++i) { + container.emplace_back(convert( + env, ScopedJavaLocalRef( + env, env->GetObjectArrayElement(j_container.obj(), i)))); + } + CHECK_EXCEPTION(env) << "Error during JavaToNativeVector"; + return container; +} + +// -------------------------------------------------------- +// -- Methods for converting native types to Java types. -- +// -------------------------------------------------------- + +ScopedJavaLocalRef NativeToJavaBoolean(JNIEnv* env, bool b); +ScopedJavaLocalRef NativeToJavaDouble(JNIEnv* env, double d); +ScopedJavaLocalRef NativeToJavaInteger(JNIEnv* jni, int32_t i); +ScopedJavaLocalRef NativeToJavaLong(JNIEnv* env, int64_t u); +ScopedJavaLocalRef NativeToJavaString(JNIEnv* jni, const char* str); +ScopedJavaLocalRef NativeToJavaString(JNIEnv* jni, + const std::string& str); + +ScopedJavaLocalRef NativeToJavaInteger( + JNIEnv* jni, + const rtc::Optional& optional_int); + // Helper function for converting std::vector into a Java array. template ScopedJavaLocalRef NativeToJavaObjectArray( @@ -166,38 +175,22 @@ ScopedJavaLocalRef NativeToJavaObjectArray( return j_container; } -ScopedJavaLocalRef NativeToJavaIntegerArray( - JNIEnv* env, - const std::vector& container); ScopedJavaLocalRef NativeToJavaBooleanArray( JNIEnv* env, const std::vector& container); -ScopedJavaLocalRef NativeToJavaLongArray( - JNIEnv* env, - const std::vector& container); ScopedJavaLocalRef NativeToJavaDoubleArray( JNIEnv* env, const std::vector& container); +ScopedJavaLocalRef NativeToJavaIntegerArray( + JNIEnv* env, + const std::vector& container); +ScopedJavaLocalRef NativeToJavaLongArray( + JNIEnv* env, + const std::vector& container); ScopedJavaLocalRef NativeToJavaStringArray( JNIEnv* env, const std::vector& container); -template -std::vector JavaToNativeVector(JNIEnv* env, - const JavaRef& j_container, - Convert convert) { - std::vector container; - const size_t size = env->GetArrayLength(j_container.obj()); - container.reserve(size); - for (size_t i = 0; i < size; ++i) { - container.emplace_back(convert( - env, ScopedJavaLocalRef( - env, env->GetObjectArrayElement(j_container.obj(), i)))); - } - CHECK_EXCEPTION(env) << "Error during JavaToNativeVector"; - return container; -} - // This is a helper class for NativeToJavaList(). Use that function instead of // using this class directly. class JavaListBuilder { @@ -248,6 +241,38 @@ ScopedJavaLocalRef NativeToJavaMap(JNIEnv* env, return builder.GetJavaMap(); } +// ------------------------ +// -- Deprecated methods -- +// ------------------------ + +// Deprecated. Use JavaToNativeString. +inline std::string JavaToStdString(JNIEnv* jni, + const JavaRef& j_string) { + return JavaToNativeString(jni, j_string); +} + +// Deprecated. Use scoped jobjects instead. +inline std::string JavaToStdString(JNIEnv* jni, jstring j_string) { + return JavaToStdString(jni, JavaParamRef(j_string)); +} + +// Deprecated. Use JavaToNativeVector instead. +// Given a List of (UTF-16) jstrings +// return a new vector of UTF-8 native strings. +std::vector JavaToStdVectorStrings(JNIEnv* jni, + const JavaRef& list); + +// Parses Map to std::map. +std::map JavaToStdMapStrings( + JNIEnv* jni, + const JavaRef& j_map); + +// Deprecated. Use scoped jobjects instead. +inline std::map JavaToStdMapStrings(JNIEnv* jni, + jobject j_map) { + return JavaToStdMapStrings(jni, JavaParamRef(j_map)); +} + } // namespace webrtc #endif // SDK_ANDROID_NATIVE_API_JNI_JAVA_TYPES_H_