diff options
-rw-r--r-- | platform/android/src/java_types.cpp | 4 | ||||
-rw-r--r-- | platform/android/src/java_types.hpp | 2 | ||||
-rw-r--r-- | platform/android/src/style/android_conversion.hpp | 7 | ||||
-rw-r--r-- | platform/android/src/style/value.cpp | 10 | ||||
-rw-r--r-- | platform/android/src/style/value.hpp | 4 |
5 files changed, 22 insertions, 5 deletions
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<bool> toBool(const mbgl::android::Value& value) { inline optional<float> 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<Value> 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<std::string>(jenv, jni::String(string)); } - float Value::toNumber() const { + float Value::toFloat() const { return jni::CallMethod<jni::jfloat>(jenv, value.get(), *java::Number::floatValueMethodId); } + double Value::toDouble() const { + return jni::CallMethod<jni::jdouble>(jenv, value.get(), *java::Number::doubleValueMethodId); + } + + long Value::toLong() const { + return jni::CallMethod<jni::jlong>(jenv, value.get(), *java::Number::longValueMethodId); + } + bool Value::toBool() const { return jni::CallMethod<jni::jboolean>(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; |