Index: base/android/scoped_java_ref_unittest.cc |
diff --git a/base/android/scoped_java_ref_unittest.cc b/base/android/scoped_java_ref_unittest.cc |
index a6dfc7a6ef22f6cdf6b1247c4497da606ece6228..e8f4f386a6799925fdc1086829673aee8544f93d 100644 |
--- a/base/android/scoped_java_ref_unittest.cc |
+++ b/base/android/scoped_java_ref_unittest.cc |
@@ -15,24 +15,26 @@ namespace { |
int g_local_refs = 0; |
int g_global_refs = 0; |
+JNINativeInterface g_previous_functions = {0}; |
+ |
jobject NewGlobalRef(JNIEnv* env, jobject obj) { |
++g_global_refs; |
- return AttachCurrentThread()->NewGlobalRef(obj); |
+ return g_previous_functions.NewGlobalRef(env, obj); |
} |
void DeleteGlobalRef(JNIEnv* env, jobject obj) { |
--g_global_refs; |
- return AttachCurrentThread()->DeleteGlobalRef(obj); |
+ return g_previous_functions.DeleteGlobalRef(env, obj); |
} |
jobject NewLocalRef(JNIEnv* env, jobject obj) { |
++g_local_refs; |
- return AttachCurrentThread()->NewLocalRef(obj); |
+ return g_previous_functions.NewLocalRef(env, obj); |
} |
void DeleteLocalRef(JNIEnv* env, jobject obj) { |
--g_local_refs; |
- return AttachCurrentThread()->DeleteLocalRef(obj); |
+ return g_previous_functions.DeleteLocalRef(env, obj); |
} |
} // namespace |
@@ -42,27 +44,27 @@ class ScopedJavaRefTest : public testing::Test { |
g_local_refs = 0; |
g_global_refs = 0; |
JNIEnv* env = AttachCurrentThread(); |
- counting_env = *env; |
- counting_functions = *counting_env.functions; |
- counting_functions.NewGlobalRef = &NewGlobalRef; |
- counting_functions.DeleteGlobalRef = &DeleteGlobalRef; |
- counting_functions.NewLocalRef = &NewLocalRef; |
- counting_functions.DeleteLocalRef = &DeleteLocalRef; |
- counting_env.functions = &counting_functions; |
+ g_previous_functions = *env->functions; |
+ // We inject our own functions in JNINativeInterface so we can keep track |
+ // of the reference counting ourselves. |
+ JNINativeInterface* native_interface = |
+ const_cast<JNINativeInterface*>(env->functions); |
+ native_interface->NewGlobalRef = &NewGlobalRef; |
+ native_interface->DeleteGlobalRef = &DeleteGlobalRef; |
+ native_interface->NewLocalRef = &NewLocalRef; |
+ native_interface->DeleteLocalRef = &DeleteLocalRef; |
} |
- // Special JNI env configured in SetUp to count in and out all local & global |
- // reference instances. Be careful to only use this with the ScopedJavaRef |
- // classes under test, else it's easy to get system references counted in |
- // here too. |
- JNIEnv counting_env; |
- JNINativeInterface counting_functions; |
+ virtual void TearDown() { |
+ JNIEnv* env = AttachCurrentThread(); |
+ *(const_cast<JNINativeInterface*>(env->functions)) = g_previous_functions; |
+ } |
}; |
// The main purpose of this is testing the various conversions compile. |
TEST_F(ScopedJavaRefTest, Conversions) { |
JNIEnv* env = AttachCurrentThread(); |
- ScopedJavaLocalRef<jstring> str(env, ConvertUTF8ToJavaString(env, "string")); |
+ ScopedJavaLocalRef<jstring> str = ConvertUTF8ToJavaString(env, "string"); |
ScopedJavaGlobalRef<jstring> global(str); |
{ |
ScopedJavaGlobalRef<jobject> global_obj(str); |
@@ -74,24 +76,27 @@ TEST_F(ScopedJavaRefTest, Conversions) { |
} |
global.Reset(str); |
const JavaRef<jstring>& str_ref = str; |
- EXPECT_EQ("string", ConvertJavaStringToUTF8(env, str_ref.obj())); |
+ EXPECT_EQ("string", ConvertJavaStringToUTF8(str_ref)); |
str.Reset(); |
} |
TEST_F(ScopedJavaRefTest, RefCounts) { |
+ JNIEnv* env = AttachCurrentThread(); |
ScopedJavaLocalRef<jstring> str; |
- str.Reset(&counting_env, ConvertUTF8ToJavaString(AttachCurrentThread(), |
- "string")); |
+ // The ConvertJavaStringToUTF8 below creates a new string that would normally |
+ // return a local ref. We simulate that by starting the g_local_refs count at |
+ // 1. |
+ g_local_refs = 1; |
+ str.Reset(ConvertUTF8ToJavaString(env, "string")); |
EXPECT_EQ(1, g_local_refs); |
EXPECT_EQ(0, g_global_refs); |
- |
{ |
ScopedJavaGlobalRef<jstring> global_str(str); |
ScopedJavaGlobalRef<jobject> global_obj(global_str); |
EXPECT_EQ(1, g_local_refs); |
EXPECT_EQ(2, g_global_refs); |
- ScopedJavaLocalRef<jstring> str2(&counting_env, str.Release()); |
+ ScopedJavaLocalRef<jstring> str2(env, str.Release()); |
EXPECT_EQ(1, g_local_refs); |
{ |
ScopedJavaLocalRef<jstring> str3(str2); |