diff options
Diffstat (limited to 'platform/android/src/text')
-rw-r--r-- | platform/android/src/text/collator.cpp | 110 | ||||
-rw-r--r-- | platform/android/src/text/collator_jni.hpp | 29 | ||||
-rw-r--r-- | platform/android/src/text/local_glyph_rasterizer.cpp | 29 | ||||
-rw-r--r-- | platform/android/src/text/local_glyph_rasterizer_jni.hpp | 4 |
4 files changed, 85 insertions, 87 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; }; diff --git a/platform/android/src/text/collator_jni.hpp b/platform/android/src/text/collator_jni.hpp index 96c381b1c1..dd3f845662 100644 --- a/platform/android/src/text/collator_jni.hpp +++ b/platform/android/src/text/collator_jni.hpp @@ -24,33 +24,40 @@ public: static jni::Object<Locale> forLanguageTag(jni::JNIEnv&, jni::String); static jni::String toLanguageTag(jni::JNIEnv&, jni::Object<Locale>); */ - static jni::Object<Locale> getDefault(jni::JNIEnv&); - static jni::String getLanguage(jni::JNIEnv&, jni::Object<Locale>); - static jni::String getCountry(jni::JNIEnv&, jni::Object<Locale>); + static jni::Local<jni::Object<Locale>> getDefault(jni::JNIEnv&); + static jni::Local<jni::String> getLanguage(jni::JNIEnv&, const jni::Object<Locale>&); + static jni::Local<jni::String> getCountry(jni::JNIEnv&, const jni::Object<Locale>&); - static jni::Object<Locale> New(jni::JNIEnv&, jni::String); - static jni::Object<Locale> New(jni::JNIEnv&, jni::String, jni::String); + static jni::Local<jni::Object<Locale>> New(jni::JNIEnv&, const jni::String&); + static jni::Local<jni::Object<Locale>> New(jni::JNIEnv&, const jni::String&, const jni::String&); - static jni::Class<Locale> javaClass; static void registerNative(jni::JNIEnv&); - }; class Collator { public: static constexpr auto Name() { return "java/text/Collator"; }; - static jni::Object<Collator> getInstance(jni::JNIEnv&, jni::Object<Locale>); + static jni::Local<jni::Object<Collator>> getInstance(jni::JNIEnv&, const jni::Object<Locale>&); - static void setStrength(jni::JNIEnv&, jni::Object<Collator>, jni::jint); + static void setStrength(jni::JNIEnv&, const jni::Object<Collator>&, jni::jint); - static jni::jint compare(jni::JNIEnv&, jni::Object<Collator>, jni::String, jni::String); + static jni::jint compare(jni::JNIEnv&, const jni::Object<Collator>&, const jni::String&, const jni::String&); - static jni::Class<Collator> javaClass; static void registerNative(jni::JNIEnv&); +}; + + +class StringUtils { +public: + static constexpr auto Name() { return "com/mapbox/mapboxsdk/utils/StringUtils"; }; + + static jni::Local<jni::String> unaccent(jni::JNIEnv&, const jni::String&); + + static void registerNative(jni::JNIEnv&); }; } // namespace android diff --git a/platform/android/src/text/local_glyph_rasterizer.cpp b/platform/android/src/text/local_glyph_rasterizer.cpp index 3dc1eb275a..8892ee3f37 100644 --- a/platform/android/src/text/local_glyph_rasterizer.cpp +++ b/platform/android/src/text/local_glyph_rasterizer.cpp @@ -36,37 +36,30 @@ namespace android { LocalGlyphRasterizer::LocalGlyphRasterizer() { UniqueEnv env { AttachEnv() }; + static auto& javaClass = jni::Class<LocalGlyphRasterizer>::Singleton(*env); static auto constructor = javaClass.GetConstructor(*env); - javaObject = javaClass.New(*env, constructor).NewGlobalRef(*env); + javaObject = jni::NewGlobal(*env, javaClass.New(*env, constructor)); } PremultipliedImage LocalGlyphRasterizer::drawGlyphBitmap(const std::string& fontFamily, const bool bold, const GlyphID glyphID) { UniqueEnv env { AttachEnv() }; - using Signature = jni::Object<Bitmap>(jni::String, jni::jboolean, jni::jchar); - static auto method = javaClass.GetMethod<Signature>(*env, "drawGlyphBitmap"); + static auto& javaClass = jni::Class<LocalGlyphRasterizer>::Singleton(*env); + static auto drawGlyphBitmap = javaClass.GetMethod<jni::Object<Bitmap> (jni::String, jni::jboolean, jni::jchar)>(*env, "drawGlyphBitmap"); - jni::String jniFontFamily = jni::Make<jni::String>(*env, fontFamily); - - auto javaBitmap = javaObject->Call(*env, - method, - jniFontFamily, - static_cast<jni::jboolean>(bold), - static_cast<jni::jchar>(glyphID)); - jni::DeleteLocalRef(*env, jniFontFamily); - - PremultipliedImage result = Bitmap::GetImage(*env, javaBitmap); - jni::DeleteLocalRef(*env, javaBitmap); - return result; + return Bitmap::GetImage(*env, + javaObject.Call(*env, + drawGlyphBitmap, + jni::Make<jni::String>(*env, fontFamily), + static_cast<jni::jboolean>(bold), + static_cast<jni::jchar>(glyphID))); } void LocalGlyphRasterizer::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<LocalGlyphRasterizer>::Find(env).NewGlobalRef(env).release(); + jni::Class<LocalGlyphRasterizer>::Singleton(env); } -jni::Class<LocalGlyphRasterizer> LocalGlyphRasterizer::javaClass; - } // namespace android class LocalGlyphRasterizer::Impl { diff --git a/platform/android/src/text/local_glyph_rasterizer_jni.hpp b/platform/android/src/text/local_glyph_rasterizer_jni.hpp index 1c83ea5f58..e80e848338 100644 --- a/platform/android/src/text/local_glyph_rasterizer_jni.hpp +++ b/platform/android/src/text/local_glyph_rasterizer_jni.hpp @@ -19,8 +19,6 @@ class LocalGlyphRasterizer { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/text/LocalGlyphRasterizer"; }; - static jni::Class<LocalGlyphRasterizer> javaClass; - static void registerNative(jni::JNIEnv&); LocalGlyphRasterizer(); @@ -28,7 +26,7 @@ public: PremultipliedImage drawGlyphBitmap(const std::string& fontFamily, const bool bold, const char16_t glyphID); private: - jni::UniqueObject<LocalGlyphRasterizer> javaObject; + jni::Global<jni::Object<LocalGlyphRasterizer>> javaObject; }; } // namespace android |