Implements JavaToNativeStringMap and adds tests for native API.
Implements JavaToNativeStringMap that is a replacement for JavaToStdMapStrings. It uses a new template method JavaToNativeMap. Also adds testing support for native API and a test for JavaToNativeStringMap. Bug: webrtc:8769 Change-Id: I580d4992a899ebe02da39af450fa51d52ee9b88b Reviewed-on: https://webrtc-review.googlesource.com/48060 Reviewed-by: Magnus Jedvert <magjed@webrtc.org> Reviewed-by: Patrik Höglund <phoglund@webrtc.org> Commit-Queue: Sami Kalliomäki <sakal@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21967}
This commit is contained in:
committed by
Commit Bot
parent
1bc1ec43a3
commit
78498cf5ee
@ -30,6 +30,8 @@ namespace webrtc {
|
||||
Iterable::Iterable(JNIEnv* jni, const JavaRef<jobject>& iterable)
|
||||
: jni_(jni), iterable_(jni, iterable) {}
|
||||
|
||||
Iterable::Iterable(Iterable&& other) = default;
|
||||
|
||||
Iterable::~Iterable() = default;
|
||||
|
||||
// Creates an iterator representing the end of any collection.
|
||||
@ -103,6 +105,22 @@ std::string GetJavaEnumName(JNIEnv* jni, const JavaRef<jobject>& j_enum) {
|
||||
return JavaToStdString(jni, JNI_Enum::Java_Enum_name(jni, j_enum));
|
||||
}
|
||||
|
||||
Iterable GetJavaMapEntrySet(JNIEnv* jni, const JavaRef<jobject>& j_map) {
|
||||
return Iterable(jni, JNI_Map::Java_Map_entrySet(jni, j_map));
|
||||
}
|
||||
|
||||
ScopedJavaLocalRef<jobject> GetJavaMapEntryKey(
|
||||
JNIEnv* jni,
|
||||
const JavaRef<jobject>& j_entry) {
|
||||
return Java_JniHelper_getKey(jni, j_entry);
|
||||
}
|
||||
|
||||
ScopedJavaLocalRef<jobject> GetJavaMapEntryValue(
|
||||
JNIEnv* jni,
|
||||
const JavaRef<jobject>& j_entry) {
|
||||
return Java_JniHelper_getValue(jni, j_entry);
|
||||
}
|
||||
|
||||
int64_t JavaToNativeLong(JNIEnv* env, const JavaRef<jobject>& j_long) {
|
||||
return JNI_Long::Java_Long_longValue(env, j_long);
|
||||
}
|
||||
@ -136,6 +154,19 @@ std::string JavaToNativeString(JNIEnv* jni, const JavaRef<jstring>& j_string) {
|
||||
return str;
|
||||
}
|
||||
|
||||
std::map<std::string, std::string> JavaToNativeStringMap(
|
||||
JNIEnv* jni,
|
||||
const JavaRef<jobject>& j_map) {
|
||||
return JavaToNativeMap<std::string, std::string>(
|
||||
jni, j_map,
|
||||
[](JNIEnv* env, JavaRef<jobject> const& key,
|
||||
JavaRef<jobject> const& value) {
|
||||
return std::make_pair(
|
||||
JavaToNativeString(env, static_java_ref_cast<jstring>(env, key)),
|
||||
JavaToNativeString(env, static_java_ref_cast<jstring>(env, value)));
|
||||
});
|
||||
}
|
||||
|
||||
ScopedJavaLocalRef<jobject> NativeToJavaBoolean(JNIEnv* env, bool b) {
|
||||
return JNI_Boolean::Java_Boolean_ConstructorJLB_Z(env, b);
|
||||
}
|
||||
@ -242,18 +273,4 @@ std::vector<std::string> JavaToStdVectorStrings(JNIEnv* jni,
|
||||
return converted_list;
|
||||
}
|
||||
|
||||
std::map<std::string, std::string> JavaToStdMapStrings(
|
||||
JNIEnv* jni,
|
||||
const JavaRef<jobject>& j_map) {
|
||||
const JavaRef<jobject>& j_entry_set = JNI_Map::Java_Map_entrySet(jni, j_map);
|
||||
std::map<std::string, std::string> result;
|
||||
for (const JavaRef<jobject>& 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;
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
@ -50,6 +50,8 @@ namespace webrtc {
|
||||
class Iterable {
|
||||
public:
|
||||
Iterable(JNIEnv* jni, const JavaRef<jobject>& iterable);
|
||||
Iterable(Iterable&& other);
|
||||
|
||||
~Iterable();
|
||||
|
||||
class Iterator {
|
||||
@ -111,6 +113,13 @@ bool IsNull(JNIEnv* jni, const JavaRef<jobject>& obj);
|
||||
// Returns the name of a Java enum.
|
||||
std::string GetJavaEnumName(JNIEnv* jni, const JavaRef<jobject>& j_enum);
|
||||
|
||||
Iterable GetJavaMapEntrySet(JNIEnv* jni, const JavaRef<jobject>& j_map);
|
||||
ScopedJavaLocalRef<jobject> GetJavaMapEntryKey(JNIEnv* jni,
|
||||
const JavaRef<jobject>& j_entry);
|
||||
ScopedJavaLocalRef<jobject> GetJavaMapEntryValue(
|
||||
JNIEnv* jni,
|
||||
const JavaRef<jobject>& j_entry);
|
||||
|
||||
// --------------------------------------------------------
|
||||
// -- Methods for converting Java types to native types. --
|
||||
// --------------------------------------------------------
|
||||
@ -141,6 +150,23 @@ std::vector<T> JavaToNativeVector(JNIEnv* env,
|
||||
return container;
|
||||
}
|
||||
|
||||
template <typename Key, typename T, typename Convert>
|
||||
std::map<Key, T> JavaToNativeMap(JNIEnv* env,
|
||||
const JavaRef<jobject>& j_map,
|
||||
Convert convert) {
|
||||
std::map<Key, T> container;
|
||||
for (auto const& j_entry : GetJavaMapEntrySet(env, j_map)) {
|
||||
container.emplace(convert(env, GetJavaMapEntryKey(env, j_entry),
|
||||
GetJavaMapEntryValue(env, j_entry)));
|
||||
}
|
||||
return container;
|
||||
}
|
||||
|
||||
// Converts Map<String, String> to std::map<std::string, std::string>.
|
||||
std::map<std::string, std::string> JavaToNativeStringMap(
|
||||
JNIEnv* env,
|
||||
const JavaRef<jobject>& j_map);
|
||||
|
||||
// --------------------------------------------------------
|
||||
// -- Methods for converting native types to Java types. --
|
||||
// --------------------------------------------------------
|
||||
@ -262,10 +288,13 @@ inline std::string JavaToStdString(JNIEnv* jni, jstring j_string) {
|
||||
std::vector<std::string> JavaToStdVectorStrings(JNIEnv* jni,
|
||||
const JavaRef<jobject>& list);
|
||||
|
||||
// Deprecated. Use JavaToNativeStringMap instead.
|
||||
// Parses Map<String, String> to std::map<std::string, std::string>.
|
||||
std::map<std::string, std::string> JavaToStdMapStrings(
|
||||
inline std::map<std::string, std::string> JavaToStdMapStrings(
|
||||
JNIEnv* jni,
|
||||
const JavaRef<jobject>& j_map);
|
||||
const JavaRef<jobject>& j_map) {
|
||||
return JavaToNativeStringMap(jni, j_map);
|
||||
}
|
||||
|
||||
// Deprecated. Use scoped jobjects instead.
|
||||
inline std::map<std::string, std::string> JavaToStdMapStrings(JNIEnv* jni,
|
||||
|
||||
@ -197,6 +197,13 @@ class ScopedJavaGlobalRef : public JavaRef<T> {
|
||||
RTC_DISALLOW_COPY_AND_ASSIGN(ScopedJavaGlobalRef);
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
inline ScopedJavaLocalRef<T> static_java_ref_cast(JNIEnv* env,
|
||||
JavaRef<jobject> const& ref) {
|
||||
ScopedJavaLocalRef<jobject> owned_ref(env, ref);
|
||||
return ScopedJavaLocalRef<T>(env, static_cast<T>(owned_ref.Release()));
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // SDK_ANDROID_NATIVE_API_JNI_SCOPED_JAVA_REF_H_
|
||||
|
||||
Reference in New Issue
Block a user