From e1a9a468a920ea3dffbac03232b2c51ef46fb815 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Mon, 27 Mar 2017 16:40:19 +0300 Subject: [android] use more appropriate numeric types for filter conversion --- platform/android/src/java_types.cpp | 4 ++++ platform/android/src/java_types.hpp | 2 ++ platform/android/src/style/android_conversion.hpp | 7 ++++--- platform/android/src/style/value.cpp | 10 +++++++++- platform/android/src/style/value.hpp | 4 +++- 5 files changed, 22 insertions(+), 5 deletions(-) (limited to 'platform') diff --git a/platform/android/src/java_types.cpp b/platform/android/src/java_types.cpp index 6383426387..dd165470cf 100644 --- a/platform/android/src/java_types.cpp +++ b/platform/android/src/java_types.cpp @@ -13,6 +13,8 @@ namespace java { jni::jclass* Number::jclass; jni::jmethodID* Number::floatValueMethodId; + jni::jmethodID* Number::doubleValueMethodId; + jni::jmethodID* Number::longValueMethodId; jni::jclass* Map::jclass; jni::jmethodID* Map::getMethodId; @@ -27,6 +29,8 @@ namespace java { Number::jclass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Number")).release(); Number::floatValueMethodId = &jni::GetMethodID(env, *Number::jclass, "floatValue", "()F"); + Number::doubleValueMethodId = &jni::GetMethodID(env, *Number::jclass, "doubleValue", "()D"); + Number::longValueMethodId = &jni::GetMethodID(env, *Number::jclass, "longValue", "()J"); Map::jclass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/util/Map")).release(); Map::getMethodId = &jni::GetMethodID(env, *Map::jclass, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); diff --git a/platform/android/src/java_types.hpp b/platform/android/src/java_types.hpp index b416a75b91..edec5cb550 100644 --- a/platform/android/src/java_types.hpp +++ b/platform/android/src/java_types.hpp @@ -22,6 +22,8 @@ namespace java { struct Number { static jni::jclass* jclass; static jni::jmethodID* floatValueMethodId; + static jni::jmethodID* doubleValueMethodId; + static jni::jmethodID* longValueMethodId; }; struct Map { diff --git a/platform/android/src/style/android_conversion.hpp b/platform/android/src/style/android_conversion.hpp index d9b88ab52b..e2b2685928 100644 --- a/platform/android/src/style/android_conversion.hpp +++ b/platform/android/src/style/android_conversion.hpp @@ -59,7 +59,8 @@ inline optional toBool(const mbgl::android::Value& value) { inline optional toNumber(const mbgl::android::Value& value) { if (value.isNumber()) { - return value.toNumber(); + auto num = value.toFloat(); + return num; } else { return {}; } @@ -81,8 +82,8 @@ inline optional toValue(const mbgl::android::Value& value) { } else if (value.isString()) { return { value.toString() }; } else if (value.isNumber()) { - // Need to cast to a double here as the float is otherwise considered a bool... - return { (double) value.toNumber() }; + auto doubleVal = value.toDouble(); + return { doubleVal - (int) doubleVal > 0.0 ? doubleVal : value.toLong() }; } else { return {}; } diff --git a/platform/android/src/style/value.cpp b/platform/android/src/style/value.cpp index 0b5d81feb1..da953c14be 100644 --- a/platform/android/src/style/value.cpp +++ b/platform/android/src/style/value.cpp @@ -55,10 +55,18 @@ namespace android { return jni::Make(jenv, jni::String(string)); } - float Value::toNumber() const { + float Value::toFloat() const { return jni::CallMethod(jenv, value.get(), *java::Number::floatValueMethodId); } + double Value::toDouble() const { + return jni::CallMethod(jenv, value.get(), *java::Number::doubleValueMethodId); + } + + long Value::toLong() const { + return jni::CallMethod(jenv, value.get(), *java::Number::longValueMethodId); + } + bool Value::toBool() const { return jni::CallMethod(jenv, value.get(), *java::Boolean::booleanValueMethodId); } diff --git a/platform/android/src/style/value.hpp b/platform/android/src/style/value.hpp index 461fc1a033..761ce4d730 100644 --- a/platform/android/src/style/value.hpp +++ b/platform/android/src/style/value.hpp @@ -21,7 +21,9 @@ public: bool isNumber() const; std::string toString() const; - float toNumber() const; + float toFloat() const; + double toDouble() const; + long toLong() const; bool toBool() const; Value get(const char* key) const; int getLength() const; -- cgit v1.2.1