Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: jni/Utils.h

Issue 4761138508070912: Issue 1848 - Clean up local reference handling (Closed)
Patch Set: Some formatting issues Created Jan. 23, 2015, 12:30 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « jni/JniWebRequest.cpp ('k') | jni/Utils.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: jni/Utils.h
diff --git a/jni/Utils.h b/jni/Utils.h
index 852457cdd95095e57e8232fe2b40ae316814c636..45b826719992f216c34e4f36b4b755945db1c3c2 100644
--- a/jni/Utils.h
+++ b/jni/Utils.h
@@ -39,6 +39,43 @@ void JniThrowException(JNIEnv* env, const std::exception& e);
void JniThrowException(JNIEnv* env);
+class JNIEnvAcquire;
+
+/**
+ * This class is _NOT_ thread safe!
+ */
+template<typename T>
+class JniLocalReference
+{
+public:
+ explicit JniLocalReference(JNIEnv* jniEnv, T object)
+ : m_JNIEnv(jniEnv), m_Object(object)
+ {
+
+ }
+
+ JniLocalReference(const JniLocalReference<T>& other);
+
+ ~JniLocalReference()
+ {
+ m_JNIEnv->DeleteLocalRef(m_Object);
+ }
+
+ T operator*()
+ {
+ return m_Object;
+ }
+
+ T Get()
+ {
+ return m_Object;
+ }
+
+private:
+ JNIEnv* m_JNIEnv;
+ T m_Object;
+};
+
class JNIEnvAcquire
{
public:
@@ -145,21 +182,24 @@ inline jobject NewJniFilter(JNIEnv* env, const AdblockPlus::FilterPtr& filter)
return 0;
}
- jclass clazz = env->FindClass(PKG("Filter"));
- jmethodID method = env->GetMethodID(clazz, "<init>", "(J)V");
- return env->NewObject(clazz, method, JniPtrToLong(new AdblockPlus::FilterPtr(filter)));
+ JniLocalReference<jclass> clazz(env, env->FindClass(PKG("Filter")));
+ jmethodID method = env->GetMethodID(*clazz, "<init>", "(J)V");
+ return env->NewObject(*clazz, method,
+ JniPtrToLong(new AdblockPlus::FilterPtr(filter)));
}
-inline jobject NewJniSubscription(JNIEnv* env, const AdblockPlus::SubscriptionPtr& subscription)
+inline jobject NewJniSubscription(JNIEnv* env,
+ const AdblockPlus::SubscriptionPtr& subscription)
{
if (!subscription.get())
{
return 0;
}
- jclass clazz = env->FindClass(PKG("Subscription"));
- jmethodID method = env->GetMethodID(clazz, "<init>", "(J)V");
- return env->NewObject(clazz, method, JniPtrToLong(new AdblockPlus::SubscriptionPtr(subscription)));
+ JniLocalReference<jclass> clazz(env, env->FindClass(PKG("Subscription")));
+ jmethodID method = env->GetMethodID(*clazz, "<init>", "(J)V");
+ return env->NewObject(*clazz, method,
+ JniPtrToLong(new AdblockPlus::SubscriptionPtr(subscription)));
}
#define CATCH_AND_THROW(jEnv) \
« no previous file with comments | « jni/JniWebRequest.cpp ('k') | jni/Utils.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld