summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2016-10-13 16:58:55 +0300
committerIvo van Dongen <ivovandongen@users.noreply.github.com>2016-10-15 10:51:19 +0300
commite5a473a30181b8790743f12e1a4f7a0e300eb8b4 (patch)
tree8bd5c85c504135a8b41731753bcaf6a1d0f0302a
parent4a0173bbd79f90a543dc51ebf15c20a3d30a8827 (diff)
downloadqtlocation-mapboxgl-e5a473a30181b8790743f12e1a4f7a0e300eb8b4.tar.gz
[android] don't delete local reference on value copy
-rw-r--r--platform/android/src/style/value.cpp45
-rw-r--r--platform/android/src/style/value.hpp6
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;
};
}