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: Formatting, explicit, unrelated change Created Feb. 3, 2015, 1:51 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
Index: jni/Utils.h
diff --git a/jni/Utils.h b/jni/Utils.h
index 905185fb2cec1865fe71ea8da00aeb29c5925e83..8259e5c7dac0296168eb36d0c5ad2a8034050d9d 100644
--- a/jni/Utils.h
+++ b/jni/Utils.h
@@ -37,6 +37,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:
+ JniLocalReference(JNIEnv* jniEnv, T object)
+ : jniEnv(jniEnv), object(object)
+ {
+
+ }
+
+ JniLocalReference(const JniLocalReference<T>& other);
+
+ ~JniLocalReference()
+ {
+ jniEnv->DeleteLocalRef(object);
+ }
+
+ T operator*()
+ {
+ return object;
+ }
+
+ T Get()
+ {
+ return object;
+ }
+
+private:
+ JNIEnv* jniEnv;
+ T object;
+};
+
class JNIEnvAcquire
{
public:
@@ -143,21 +180,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) \
« jni/JniWebRequest.cpp ('K') | « jni/JniWebRequest.cpp ('k') | jni/Utils.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld