diff options
Diffstat (limited to 'platform/android/src/text')
-rw-r--r-- | platform/android/src/text/collator.cpp | 40 | ||||
-rw-r--r-- | platform/android/src/text/collator_jni.hpp | 30 |
2 files changed, 70 insertions, 0 deletions
diff --git a/platform/android/src/text/collator.cpp b/platform/android/src/text/collator.cpp index 37af0a1c5b..1f795427ad 100644 --- a/platform/android/src/text/collator.cpp +++ b/platform/android/src/text/collator.cpp @@ -5,6 +5,7 @@ #include <unaccent.hpp> #include <jni/jni.hpp> +#include "src/java/lang.hpp" #include "../attach_env.hpp" #include "collator_jni.hpp" @@ -36,6 +37,45 @@ jni::jint Collator::compare(jni::JNIEnv& env, jni::Object<Collator> collator, jn return collator.Call(env, method, lhs, rhs); } +void Normalizer::Form::registerNative(jni::JNIEnv& env) { + javaClass = *jni::Class<Form>::Find(env).NewGlobalRef(env).release(); +} + +jni::Class<Normalizer::Form> Normalizer::Form::javaClass; + +jni::Object<Normalizer::Form> Normalizer::Form::create(jni::JNIEnv& env, Value value) { + switch (value) { + case NFC: + return javaClass.Get(env, + jni::StaticField<Form, jni::Object<Form>>(env, javaClass, "NFC")); + case NFKC: + return javaClass.Get(env, + jni::StaticField<Form, jni::Object<Form>>(env, javaClass, "NFKC")); + case NFD: + return javaClass.Get(env, + jni::StaticField<Form, jni::Object<Form>>(env, javaClass, "NFD")); + case NFKD: + return javaClass.Get(env, + jni::StaticField<Form, jni::Object<Form>>(env, javaClass, "NFKD")); + default: + throw std::runtime_error("invalid enum value for Normalizer.Form"); + } +} + +void Normalizer::registerNative(jni::JNIEnv& env) { + javaClass = *jni::Class<Normalizer>::Find(env).NewGlobalRef(env).release(); + Form::registerNative(env); +} + +jni::Class<Normalizer> Normalizer::javaClass; + +jni::String Normalizer::normalize(jni::JNIEnv& env, jni::String value) { + using Signature = jni::String(jni::Object<java::lang::CharSequence>,jni::Object<Normalizer::Form>); + auto charSequence = jni::Cast(env, value, java::lang::CharSequence::javaClass); + auto method = javaClass.GetStaticMethod<Signature>(env, "normalize"); + return javaClass.Call(env, method, charSequence, Form::create(env, Form::NFD)); +} + void Locale::registerNative(jni::JNIEnv& env) { javaClass = *jni::Class<Locale>::Find(env).NewGlobalRef(env).release(); } diff --git a/platform/android/src/text/collator_jni.hpp b/platform/android/src/text/collator_jni.hpp index 96c381b1c1..f40dc83f4e 100644 --- a/platform/android/src/text/collator_jni.hpp +++ b/platform/android/src/text/collator_jni.hpp @@ -53,5 +53,35 @@ public: }; +class Normalizer { +public: + class Form { + public: + static constexpr auto Name() { return "java/text/Normalizer$Form"; }; + + enum Value { + NFC, + NFD, + NFKC, + NFKD, + }; + + static jni::Object<Form> create(jni::JNIEnv&, Value); + + static jni::Class<Form> javaClass; + + static void registerNative(jni::JNIEnv&); + }; + + static constexpr auto Name() { return "java/text/Normalizer"; }; + + static jni::String normalize(jni::JNIEnv&, jni::String); + + static jni::Class<Normalizer> javaClass; + + static void registerNative(jni::JNIEnv&); + +}; + } // namespace android } // namespace mbgl |