diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2016-10-13 16:58:55 +0300 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2016-10-15 10:51:19 +0300 |
commit | e5a473a30181b8790743f12e1a4f7a0e300eb8b4 (patch) | |
tree | 8bd5c85c504135a8b41731753bcaf6a1d0f0302a /platform | |
parent | 4a0173bbd79f90a543dc51ebf15c20a3d30a8827 (diff) | |
download | qtlocation-mapboxgl-e5a473a30181b8790743f12e1a4f7a0e300eb8b4.tar.gz |
[android] don't delete local reference on value copy
Diffstat (limited to 'platform')
-rw-r--r-- | platform/android/src/style/value.cpp | 45 | ||||
-rw-r--r-- | platform/android/src/style/value.hpp | 6 |
2 files changed, 32 insertions, 19 deletions
diff --git a/platform/android/src/style/value.cpp b/platform/android/src/style/value.cpp index c03dd39132..c8aad1682b 100644 --- a/platform/android/src/style/value.cpp +++ b/platform/android/src/style/value.cpp @@ -5,65 +5,76 @@ namespace mbgl { namespace android { + class ObjectDeleter { + public: + ObjectDeleter() = default; + ObjectDeleter(JNIEnv& e) : env(e) {} + + void operator()(jni::jobject* p) const { + if (p) { + jni::DeleteLocalRef(env, p); + } + } + + private: + JNIEnv& env; + }; + //Instance - Value::Value(jni::JNIEnv& env, jni::jobject* _value) : jenv(env), value(_value) {} + Value::Value(jni::JNIEnv& env, jni::jobject* _value) : jenv(env), value(_value, ObjectDeleter(env)) {} - Value::~Value() { - if (value) { - jni::DeleteLocalRef(jenv, value); - } - } + Value::~Value() = default; bool Value::isNull() const { return value == nullptr; } bool Value::isArray() const { - return jni::IsInstanceOf(jenv, value, *java::ObjectArray::jclass); + return jni::IsInstanceOf(jenv, value.get(), *java::ObjectArray::jclass); } bool Value::isObject() const { - return jni::IsInstanceOf(jenv, value, *java::Map::jclass);; + return jni::IsInstanceOf(jenv, value.get(), *java::Map::jclass);; } bool Value::isString() const { - return jni::IsInstanceOf(jenv, value, *java::String::jclass); + return jni::IsInstanceOf(jenv, value.get(), *java::String::jclass); } bool Value::isBool() const { - return jni::IsInstanceOf(jenv, value, *java::Boolean::jclass); + return jni::IsInstanceOf(jenv, value.get(), *java::Boolean::jclass); } bool Value::isNumber() const { - return jni::IsInstanceOf(jenv, value, *java::Number::jclass); + return jni::IsInstanceOf(jenv, value.get(), *java::Number::jclass); } std::string Value::toString() const { - jni::jstring* string = reinterpret_cast<jni::jstring*>(value); + jni::jstring* string = reinterpret_cast<jni::jstring*>(value.get()); return jni::Make<std::string>(jenv, jni::String(string)); } float Value::toNumber() const { - return jni::CallMethod<jni::jfloat>(jenv, value, *java::Number::floatValueMethodId); + return jni::CallMethod<jni::jfloat>(jenv, value.get(), *java::Number::floatValueMethodId); } bool Value::toBool() const { - return jni::CallMethod<jni::jboolean>(jenv, value, *java::Boolean::booleanValueMethodId); + return jni::CallMethod<jni::jboolean>(jenv, value.get(), *java::Boolean::booleanValueMethodId); } Value Value::get(const char* key) const { - jni::jobject* member = jni::CallMethod<jni::jobject*>(jenv, value, *java::Map::getMethodId, jni::Make<jni::String>(jenv, std::string(key)).Get()); + jni::jobject* member = jni::CallMethod<jni::jobject*>(jenv, value.get(), *java::Map::getMethodId, jni::Make<jni::String>(jenv, std::string(key)).Get()); return Value(jenv, member); } int Value::getLength() const { - auto array = (jni::jarray<jni::jobject>*) value; + auto array = (jni::jarray<jni::jobject>*) value.get(); return jni::GetArrayLength(jenv, *array); } Value Value::get(const int index ) const { - auto array = (jni::jarray<jni::jobject>*) value; + auto array = (jni::jarray<jni::jobject>*) value.get(); return Value(jenv, jni::GetObjectArrayElement(jenv, *array, index)); } } diff --git a/platform/android/src/style/value.hpp b/platform/android/src/style/value.hpp index 2f0b1d9706..461fc1a033 100644 --- a/platform/android/src/style/value.hpp +++ b/platform/android/src/style/value.hpp @@ -7,7 +7,7 @@ namespace mbgl { namespace android { -class Value { +class Value { public: Value(jni::JNIEnv&, jni::jobject*); @@ -27,8 +27,10 @@ public: int getLength() const; Value get(const int index ) const; +private: + jni::JNIEnv& jenv; - jni::jobject* value; + std::shared_ptr<jni::jobject> value; }; } |