| 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 f8bc675f1dbe1f778feabdf6f0c36bcb0d312cae..36f253c4e99cfb0d684b1cb97df73fb9a7bbe366 100644
|
| --- a/base/android/scoped_java_ref_unittest.cc
|
| +++ b/base/android/scoped_java_ref_unittest.cc
|
| @@ -15,26 +15,26 @@ namespace {
|
| int g_local_refs = 0;
|
| int g_global_refs = 0;
|
|
|
| -JNINativeInterface g_previous_functions = {0};
|
| +const JNINativeInterface* g_previous_functions;
|
|
|
| jobject NewGlobalRef(JNIEnv* env, jobject obj) {
|
| ++g_global_refs;
|
| - return g_previous_functions.NewGlobalRef(env, obj);
|
| + return g_previous_functions->NewGlobalRef(env, obj);
|
| }
|
|
|
| void DeleteGlobalRef(JNIEnv* env, jobject obj) {
|
| --g_global_refs;
|
| - return g_previous_functions.DeleteGlobalRef(env, obj);
|
| + return g_previous_functions->DeleteGlobalRef(env, obj);
|
| }
|
|
|
| jobject NewLocalRef(JNIEnv* env, jobject obj) {
|
| ++g_local_refs;
|
| - return g_previous_functions.NewLocalRef(env, obj);
|
| + return g_previous_functions->NewLocalRef(env, obj);
|
| }
|
|
|
| void DeleteLocalRef(JNIEnv* env, jobject obj) {
|
| --g_local_refs;
|
| - return g_previous_functions.DeleteLocalRef(env, obj);
|
| + return g_previous_functions->DeleteLocalRef(env, obj);
|
| }
|
| } // namespace
|
|
|
| @@ -44,21 +44,24 @@ class ScopedJavaRefTest : public testing::Test {
|
| g_local_refs = 0;
|
| g_global_refs = 0;
|
| JNIEnv* env = AttachCurrentThread();
|
| - g_previous_functions = *env->functions;
|
| + g_previous_functions = env->functions;
|
| + hooked_functions = *g_previous_functions;
|
| + env->functions = &hooked_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;
|
| + hooked_functions.NewGlobalRef = &NewGlobalRef;
|
| + hooked_functions.DeleteGlobalRef = &DeleteGlobalRef;
|
| + hooked_functions.NewLocalRef = &NewLocalRef;
|
| + hooked_functions.DeleteLocalRef = &DeleteLocalRef;
|
| }
|
|
|
| virtual void TearDown() {
|
| JNIEnv* env = AttachCurrentThread();
|
| - *(const_cast<JNINativeInterface*>(env->functions)) = g_previous_functions;
|
| + env->functions = g_previous_functions;
|
| }
|
| + // From JellyBean release, the instance of this struct provided in JNIEnv is
|
| + // read-only, so we deep copy it to allow individual functions to be hooked.
|
| + JNINativeInterface hooked_functions;
|
| };
|
|
|
| // The main purpose of this is testing the various conversions compile.
|
|
|