From d196f527927f34fbca7c03a3023cd7c85e0aa59b Mon Sep 17 00:00:00 2001 From: tobrun Date: Mon, 3 Sep 2018 11:58:54 +0200 Subject: [android] - add platform specific implementation of unaccent --- .../activity/render/RenderTestActivity.java | 3 +- platform/android/config.cmake | 3 -- platform/android/core-files.txt | 2 +- platform/android/scripts/run-render-test.py | 2 +- platform/android/src/java/lang.cpp | 14 ++++++++ platform/android/src/java/lang.hpp | 12 +++++++ platform/android/src/jni.cpp | 2 ++ platform/android/src/text/collator.cpp | 40 ++++++++++++++++++++++ platform/android/src/text/collator_jni.hpp | 30 ++++++++++++++++ platform/android/src/unaccent.cpp | 20 +++++++++++ 10 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 platform/android/src/unaccent.cpp diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java index e3c5254805..7bbaed192f 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/render/RenderTestActivity.java @@ -56,6 +56,7 @@ public class RenderTestActivity extends AppCompatActivity { add("overlapping,raster-masking"); add("missing,raster-loading"); add("pitchAndBearing,line-pitch"); + add("overdraw,sparse-tileset"); } }; @@ -292,7 +293,7 @@ public class RenderTestActivity extends AppCompatActivity { } public void onLoadIgnoreList(List ignoreList) { - Timber.e("We loaded %s amount of tests to be ignored", ignoreList.size()); + Timber.e("We loaded %s of tests to be ignored", ignoreList.size()); EXCLUDED_TESTS.addAll(ignoreList); new LoadRenderDefinitionTask(this).execute(); } diff --git a/platform/android/config.cmake b/platform/android/config.cmake index 714d566bd8..954b4e8faa 100644 --- a/platform/android/config.cmake +++ b/platform/android/config.cmake @@ -1,7 +1,5 @@ set(USE_GLES2 ON) -include(cmake/nunicode.cmake) - # Build thin archives. set(CMAKE_CXX_ARCHIVE_CREATE " cruT ") set(CMAKE_C_ARCHIVE_CREATE " cruT ") @@ -48,7 +46,6 @@ macro(mbgl_platform_core) target_add_mason_package(mbgl-core PRIVATE icu) target_link_libraries(mbgl-core - PRIVATE nunicode PUBLIC expected PUBLIC -llog PUBLIC -landroid diff --git a/platform/android/core-files.txt b/platform/android/core-files.txt index 9c314fad9f..7a2a94f84a 100644 --- a/platform/android/core-files.txt +++ b/platform/android/core-files.txt @@ -14,7 +14,7 @@ platform/android/src/thread.cpp platform/android/src/string_util.cpp platform/default/bidi.cpp platform/default/thread_local.cpp -platform/default/unaccent.cpp +platform/android/src/unaccent.cpp platform/default/unaccent.hpp platform/default/utf.cpp diff --git a/platform/android/scripts/run-render-test.py b/platform/android/scripts/run-render-test.py index 1a7289a116..940ae7a3df 100644 --- a/platform/android/scripts/run-render-test.py +++ b/platform/android/scripts/run-render-test.py @@ -3,7 +3,7 @@ import os import shutil -catPath = os.getcwd() + "/platform/android/build/render-test/render/" +catPath = os.getcwd() + "/platform/android/build/render-test/" failCounter = 0 testCounter = 0 for cat in os.listdir(catPath): diff --git a/platform/android/src/java/lang.cpp b/platform/android/src/java/lang.cpp index 9e98410448..47bdc451c5 100644 --- a/platform/android/src/java/lang.cpp +++ b/platform/android/src/java/lang.cpp @@ -5,6 +5,15 @@ namespace android { namespace java { namespace lang { +// CharSequence + +void CharSequence::registerNative(jni::JNIEnv &env) { + // Lookup the class + javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); +} + +jni::Class CharSequence::javaClass; + // String jni::String String::toUpperCase(JNIEnv& env, jni::String value) { @@ -17,6 +26,11 @@ jni::String String::toLowerCase(JNIEnv& env, jni::String value) { return value.Call(env, method); } +jni::String String::replaceAll(JNIEnv& env, jni::String value, jni::String regex, jni::String replaceValue) { + static auto method = javaClass.GetMethod(env, "replaceAll"); + return value.Call(env, method, regex, replaceValue); +} + void String::registerNative(jni::JNIEnv& env) { // Lookup the class javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); diff --git a/platform/android/src/java/lang.hpp b/platform/android/src/java/lang.hpp index 893d84dad1..0f3d650095 100644 --- a/platform/android/src/java/lang.hpp +++ b/platform/android/src/java/lang.hpp @@ -8,12 +8,24 @@ namespace android { namespace java { namespace lang { + +class CharSequence : private mbgl::util::noncopyable { +public: + static constexpr auto Name() { return "java/lang/CharSequence"; }; + + static jni::Class javaClass; + + static void registerNative(jni::JNIEnv&); +}; + class String : private mbgl::util::noncopyable { public: static jni::String toUpperCase(JNIEnv&, jni::String); static jni::String toLowerCase(JNIEnv&, jni::String); + static jni::String replaceAll(JNIEnv&, jni::String, jni::String, jni::String); + static jni::Class javaClass; static void registerNative(jni::JNIEnv&); diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index af1df5282c..08f9b55689 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -121,6 +121,7 @@ void registerNatives(JavaVM *vm) { java::lang::Double::registerNative(env); java::lang::Long::registerNative(env); java::lang::String::registerNative(env); + java::lang::CharSequence::registerNative(env); // GeoJSON geojson::Feature::registerNative(env); @@ -194,6 +195,7 @@ void registerNatives(JavaVM *vm) { LocalGlyphRasterizer::registerNative(env); Locale::registerNative(env); Collator::registerNative(env); + Normalizer::registerNative(env); // Logger Logger::registerNative(env); 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 #include +#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, jn return collator.Call(env, method, lhs, rhs); } +void Normalizer::Form::registerNative(jni::JNIEnv& env) { + javaClass = *jni::Class
::Find(env).NewGlobalRef(env).release(); +} + +jni::Class Normalizer::Form::javaClass; + +jni::Object Normalizer::Form::create(jni::JNIEnv& env, Value value) { + switch (value) { + case NFC: + return javaClass.Get(env, + jni::StaticField>(env, javaClass, "NFC")); + case NFKC: + return javaClass.Get(env, + jni::StaticField>(env, javaClass, "NFKC")); + case NFD: + return javaClass.Get(env, + jni::StaticField>(env, javaClass, "NFD")); + case NFKD: + return javaClass.Get(env, + jni::StaticField>(env, javaClass, "NFKD")); + default: + throw std::runtime_error("invalid enum value for Normalizer.Form"); + } +} + +void Normalizer::registerNative(jni::JNIEnv& env) { + javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); + Form::registerNative(env); +} + +jni::Class Normalizer::javaClass; + +jni::String Normalizer::normalize(jni::JNIEnv& env, jni::String value) { + using Signature = jni::String(jni::Object,jni::Object); + auto charSequence = jni::Cast(env, value, java::lang::CharSequence::javaClass); + auto method = javaClass.GetStaticMethod(env, "normalize"); + return javaClass.Call(env, method, charSequence, Form::create(env, Form::NFD)); +} + void Locale::registerNative(jni::JNIEnv& env) { javaClass = *jni::Class::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 create(jni::JNIEnv&, Value); + + static jni::Class 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 javaClass; + + static void registerNative(jni::JNIEnv&); + +}; + } // namespace android } // namespace mbgl diff --git a/platform/android/src/unaccent.cpp b/platform/android/src/unaccent.cpp new file mode 100644 index 0000000000..ad804b3aae --- /dev/null +++ b/platform/android/src/unaccent.cpp @@ -0,0 +1,20 @@ +#include +#include +#include +#include "attach_env.hpp" +#include "text/collator_jni.hpp" + +namespace mbgl { +namespace platform { + +std::string unaccent(const std::string& str) { + android::UniqueEnv env = android::AttachEnv(); + jni::String normalized = android::Normalizer::normalize(*env,jni::Make(*env, str)); + jni::String unaccented = android::java::lang::String::replaceAll(*env, normalized, + jni::Make(*env, "\\p{InCombiningDiacriticalMarks}+"), + jni::Make(*env, "")); + return jni::Make(*env, unaccented); +} + +} // namespace platform +} // namespace mbgl -- cgit v1.2.1