From 2aa2f9a6a004de416ee19a91bc30f0220b9a3228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Tue, 25 Apr 2017 17:29:49 +0200 Subject: [android] use jni::Make and global cache for constant conversion --- platform/android/src/conversion/constant.hpp | 69 +++++++++++----------------- 1 file changed, 26 insertions(+), 43 deletions(-) diff --git a/platform/android/src/conversion/constant.hpp b/platform/android/src/conversion/constant.hpp index eefd197bc8..708983cbc1 100644 --- a/platform/android/src/conversion/constant.hpp +++ b/platform/android/src/conversion/constant.hpp @@ -17,50 +17,43 @@ namespace conversion { template <> struct Converter { - Result operator()(jni::JNIEnv& env, const bool& value) const { - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Boolean")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(Z)V"); - return {&jni::NewObject(env, *javaClass, *constructor, (jboolean) value)}; + Result operator()(jni::JNIEnv& env, bool value) const { + return { jni::Make(env, value).Get() }; } }; template <> struct Converter { - Result operator()(jni::JNIEnv&, const bool& value) const { - return {(jni::jboolean) value}; + Result operator()(jni::JNIEnv&, bool value) const { + return { (jni::jboolean)value }; } }; template <> struct Converter { - Result operator()(jni::JNIEnv& env, const float& value) const { - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Float")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(F)V"); - return {&jni::NewObject(env, *javaClass, *constructor, (jfloat) value)}; + Result operator()(jni::JNIEnv& env, float value) const { + return { jni::Make(env, value).Get() }; } }; template <> struct Converter { - Result operator()(jni::JNIEnv&, const float& value) const { - return {(jni::jfloat) value}; + Result operator()(jni::JNIEnv&, float value) const { + return { (jni::jfloat)value }; } }; - template <> struct Converter { - Result operator()(jni::JNIEnv& env, const double& value) const { - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Double")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(D)V"); - return {&jni::NewObject(env, *javaClass, *constructor, (jfloat) value)}; + Result operator()(jni::JNIEnv& env, double value) const { + return { jni::Make(env, value).Get() }; } }; template <> struct Converter { - Result operator()(jni::JNIEnv&, const double& value) const { - return {(jni::jdouble) value}; + Result operator()(jni::JNIEnv&, double value) const { + return { (jni::jdouble)value }; } }; @@ -68,12 +61,10 @@ struct Converter { * All integrals. java is limited to 64 bit signed, so... * TODO: use BigDecimal for > 64 / unsigned? */ -template +template struct Converter::value>::type> { - Result operator()(jni::JNIEnv& env, const T& value) const { - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Long")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(J)V"); - return {&jni::NewObject(env, *javaClass, *constructor, (jlong) value)}; + Result operator()(jni::JNIEnv& env, T value) const { + return { jni::Make(env, value).Get() }; } }; @@ -82,14 +73,14 @@ struct Converter:: template <> struct Converter { Result operator()(jni::JNIEnv& env, const std::string& value) const { - return {jni::Make(env, value).Get()}; + return { jni::Make(env, value).Get() }; } }; template <> struct Converter { Result operator()(jni::JNIEnv& env, const std::string& value) const { - return {jni::Make(env, value).Get()}; + return { jni::Make(env, value).Get() }; } }; @@ -117,30 +108,22 @@ struct Converter> { template <> struct Converter> { Result operator()(jni::JNIEnv& env, const std::vector& value) const { - static jni::jclass* stringCass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/String")).release(); - jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *stringCass); - - for(size_t i = 0; i < value.size(); i = i + 1) { - Result converted = convert(env, value.at(i)); - jni::SetObjectArrayElement(env, jarray, i, *converted); + auto array = jni::Make>(env, value.size()); + for (size_t i = 0; i < value.size(); ++i) { + array.Set(env, i, jni::Make(env, value.at(i))); } - - return &jarray; + return { array.Get() }; } }; template <> struct Converter> { Result operator()(jni::JNIEnv& env, const std::vector& value) const { - static jni::jclass* floatClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Float")).release(); - jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *floatClass); - - for(size_t i = 0; i < value.size(); i = i + 1) { - Result converted = convert(env, value.at(i)); - jni::SetObjectArrayElement(env, jarray, i, *converted); + auto array = jni::Make>(env, value.size()); + for (size_t i = 0; i < value.size(); ++i) { + array.Set(env, i, jni::Make(env, value.at(i))); } - - return &jarray; + return { array.Get() }; } }; @@ -154,5 +137,5 @@ struct Converter { }; } // namespace conversion -} // namespace style +} // namespace android } // namespace mbgl -- cgit v1.2.1