summaryrefslogtreecommitdiff
path: root/platform/android/src/text/collator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/text/collator.cpp')
-rw-r--r--platform/android/src/text/collator.cpp110
1 files changed, 55 insertions, 55 deletions
diff --git a/platform/android/src/text/collator.cpp b/platform/android/src/text/collator.cpp
index 37af0a1c5b..381851eff2 100644
--- a/platform/android/src/text/collator.cpp
+++ b/platform/android/src/text/collator.cpp
@@ -13,34 +13,42 @@ namespace mbgl {
namespace android {
void Collator::registerNative(jni::JNIEnv& env) {
- javaClass = *jni::Class<Collator>::Find(env).NewGlobalRef(env).release();
+ jni::Class<Collator>::Singleton(env);
}
-jni::Class<Collator> Collator::javaClass;
-
-jni::Object<Collator> Collator::getInstance(jni::JNIEnv& env, jni::Object<Locale> locale) {
- using Signature = jni::Object<Collator>(jni::Object<Locale>);
- auto method = javaClass.GetStaticMethod<Signature>(env, "getInstance");
+jni::Local<jni::Object<Collator>> Collator::getInstance(jni::JNIEnv& env, const jni::Object<Locale>& locale) {
+ static auto& javaClass = jni::Class<Collator>::Singleton(env);
+ static auto method = javaClass.GetStaticMethod<jni::Object<Collator> (jni::Object<Locale>)>(env, "getInstance");
return javaClass.Call(env, method, locale);
}
-void Collator::setStrength(jni::JNIEnv& env, jni::Object<Collator> collator, jni::jint strength) {
- using Signature = void(jni::jint);
- auto static method = javaClass.GetMethod<Signature>(env, "setStrength");
+void Collator::setStrength(jni::JNIEnv& env, const jni::Object<Collator>& collator, jni::jint strength) {
+ static auto& javaClass = jni::Class<Collator>::Singleton(env);
+ static auto method = javaClass.GetMethod<void (jni::jint)>(env, "setStrength");
collator.Call(env, method, strength);
}
-jni::jint Collator::compare(jni::JNIEnv& env, jni::Object<Collator> collator, jni::String lhs, jni::String rhs) {
- using Signature = jni::jint(jni::String, jni::String);
- auto static method = javaClass.GetMethod<Signature>(env, "compare");
+jni::jint Collator::compare(jni::JNIEnv& env, const jni::Object<Collator>& collator, const jni::String& lhs, const jni::String& rhs) {
+ static auto& javaClass = jni::Class<Collator>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::jint (jni::String, jni::String)>(env, "compare");
return collator.Call(env, method, lhs, rhs);
}
+void StringUtils::registerNative(jni::JNIEnv& env) {
+ jni::Class<StringUtils>::Singleton(env);
+}
+
+jni::Local<jni::String> StringUtils::unaccent(jni::JNIEnv& env, const jni::String& value) {
+ static auto& javaClass = jni::Class<StringUtils>::Singleton(env);
+ static auto method = javaClass.GetStaticMethod<jni::String (jni::String)>(env, "unaccent");
+ return javaClass.Call(env, method, value);
+}
+
void Locale::registerNative(jni::JNIEnv& env) {
- javaClass = *jni::Class<Locale>::Find(env).NewGlobalRef(env).release();
+ jni::Class<Locale>::Singleton(env);
}
- /*
+/*
We would prefer to use for/toLanguageTag, but they're only available in API level 21+
jni::Object<Locale> Locale::forLanguageTag(jni::JNIEnv& env, jni::String languageTag) {
@@ -54,39 +62,38 @@ jni::String Locale::toLanguageTag(jni::JNIEnv& env, jni::Object<Locale> locale)
auto static method = javaClass.GetMethod<Signature>(env, "toLanguageTag");
return locale.Call(env, method);
}
- */
-
+*/
-jni::String Locale::getLanguage(jni::JNIEnv& env, jni::Object<Locale> locale) {
- using Signature = jni::String();
- auto static method = javaClass.GetMethod<Signature>(env, "getLanguage");
+jni::Local<jni::String> Locale::getLanguage(jni::JNIEnv& env, const jni::Object<Locale>& locale) {
+ static auto& javaClass = jni::Class<Locale>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::String ()>(env, "getLanguage");
return locale.Call(env, method);
}
-jni::String Locale::getCountry(jni::JNIEnv& env, jni::Object<Locale> locale) {
- using Signature = jni::String();
- auto static method = javaClass.GetMethod<Signature>(env, "getCountry");
+jni::Local<jni::String> Locale::getCountry(jni::JNIEnv& env, const jni::Object<Locale>& locale) {
+ static auto& javaClass = jni::Class<Locale>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::String ()>(env, "getCountry");
return locale.Call(env, method);
}
-jni::Object<Locale> Locale::getDefault(jni::JNIEnv& env) {
- using Signature = jni::Object<Locale>();
- auto method = javaClass.GetStaticMethod<Signature>(env, "getDefault");
+jni::Local<jni::Object<Locale>> Locale::getDefault(jni::JNIEnv& env) {
+ static auto& javaClass = jni::Class<Locale>::Singleton(env);
+ static auto method = javaClass.GetStaticMethod<jni::Object<Locale> ()>(env, "getDefault");
return javaClass.Call(env, method);
}
-jni::Object<Locale> Locale::New(jni::JNIEnv& env, jni::String language) {
+jni::Local<jni::Object<Locale>> Locale::New(jni::JNIEnv& env, const jni::String& language) {
+ static auto& javaClass = jni::Class<Locale>::Singleton(env);
static auto constructor = javaClass.GetConstructor<jni::String>(env);
return javaClass.New(env, constructor, language);
}
-jni::Object<Locale> Locale::New(jni::JNIEnv& env, jni::String language, jni::String region) {
+jni::Local<jni::Object<Locale>> Locale::New(jni::JNIEnv& env, const jni::String& language, const jni::String& region) {
+ static auto& javaClass = jni::Class<Locale>::Singleton(env);
static auto constructor = javaClass.GetConstructor<jni::String, jni::String>(env);
return javaClass.New(env, constructor, language, region);
}
-jni::Class<Locale> Locale::javaClass;
-
} // namespace android
namespace style {
@@ -101,26 +108,25 @@ public:
{
LanguageTag languageTag = locale_ ? LanguageTag::fromBCP47(*locale_) : LanguageTag();
if (!languageTag.language) {
- locale = android::Locale::getDefault(*env).NewGlobalRef(*env);
+ locale = jni::NewGlobal(*env,
+ android::Locale::getDefault(*env));
} else if (!languageTag.region) {
- locale = android::Locale::New(*env,
- jni::Make<jni::String>(*env, *(languageTag.language)))
- .NewGlobalRef(*env);
+ locale = jni::NewGlobal(*env,
+ android::Locale::New(*env, jni::Make<jni::String>(*env, *languageTag.language)));
} else {
- locale = android::Locale::New(*env,
- jni::Make<jni::String>(*env, *(languageTag.language)),
- jni::Make<jni::String>(*env, *(languageTag.region)))
- .NewGlobalRef(*env);
+ locale = jni::NewGlobal(*env,
+ android::Locale::New(*env, jni::Make<jni::String>(*env, *languageTag.language),
+ jni::Make<jni::String>(*env, *languageTag.region)));
}
- collator = android::Collator::getInstance(*env, *locale).NewGlobalRef(*env);;
+ collator = jni::NewGlobal(*env, android::Collator::getInstance(*env, locale));
if (!diacriticSensitive && !caseSensitive) {
- android::Collator::setStrength(*env, *collator, 0 /*PRIMARY*/);
+ android::Collator::setStrength(*env, collator, 0 /*PRIMARY*/);
} else if (diacriticSensitive && !caseSensitive) {
- android::Collator::setStrength(*env, *collator, 1 /*SECONDARY*/);
+ android::Collator::setStrength(*env, collator, 1 /*SECONDARY*/);
} else if (caseSensitive) {
// If we're case-sensitive and diacritic-sensitive, we use a case-sensitive collator
// and a fallback implementation of diacritic-insensitivity.
- android::Collator::setStrength(*env, *collator, 2 /*TERTIARY*/);
+ android::Collator::setStrength(*env, collator, 2 /*TERTIARY*/);
}
}
@@ -138,28 +144,21 @@ public:
// Because of the difference in locale-awareness, this means turning on case-sensitivity
// can _potentially_ change compare results for strings that don't actually have any case
// differences.
- jni::String jlhs = jni::Make<jni::String>(*env, useUnaccent ?
+ jni::Local<jni::String> jlhs = jni::Make<jni::String>(*env, useUnaccent ?
platform::unaccent(lhs) :
lhs);
- jni::String jrhs = jni::Make<jni::String>(*env, useUnaccent ?
+ jni::Local<jni::String> jrhs = jni::Make<jni::String>(*env, useUnaccent ?
platform::unaccent(rhs) :
rhs);
- jni::jint result = android::Collator::compare(*env, *collator, jlhs, jrhs);;
-
- jni::DeleteLocalRef(*env, jlhs);
- jni::DeleteLocalRef(*env, jrhs);
+ jni::jint result = android::Collator::compare(*env, collator, jlhs, jrhs);
return result;
}
std::string resolvedLocale() const {
- jni::String jLanguage = android::Locale::getLanguage(*env, *locale);
- std::string language = jni::Make<std::string>(*env, jLanguage);
- jni::DeleteLocalRef(*env, jLanguage);
- jni::String jRegion = android::Locale::getCountry(*env, *locale);
- std::string region = jni::Make<std::string>(*env, jRegion);
- jni::DeleteLocalRef(*env, jRegion);
+ std::string language = jni::Make<std::string>(*env, android::Locale::getLanguage(*env, locale));
+ std::string region = jni::Make<std::string>(*env, android::Locale::getCountry(*env, locale));
optional<std::string> resultLanguage;
if (!language.empty()) resultLanguage = language;
@@ -168,13 +167,14 @@ public:
return LanguageTag(resultLanguage, {}, resultRegion).toBCP47();
}
+
private:
bool caseSensitive;
bool diacriticSensitive;
android::UniqueEnv env;
- jni::UniqueObject<android::Collator> collator;
- jni::UniqueObject<android::Locale> locale;
+ jni::Global<jni::Object<android::Collator>> collator;
+ jni::Global<jni::Object<android::Locale>> locale;
};