1 // Copyright 2015 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/android/context_utils.h" 6 7 #include <jni.h> 8 9 #include "base/android/scoped_java_ref.h" 10 #include "base/lazy_instance.h" 11 #include "jni/ContextUtils_jni.h" 12 13 using base::android::JavaRef; 14 15 namespace base { 16 namespace android { 17 18 namespace { 19 20 // Leak the global app context, as it is used from a non-joinable worker thread 21 // that may still be running at shutdown. There is no harm in doing this. 22 base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject>>::Leaky 23 g_application_context = LAZY_INSTANCE_INITIALIZER; 24 SetNativeApplicationContext(JNIEnv * env,const JavaRef<jobject> & context)25void SetNativeApplicationContext(JNIEnv* env, const JavaRef<jobject>& context) { 26 if (env->IsSameObject(g_application_context.Get().obj(), context.obj())) { 27 // It's safe to set the context more than once if it's the same context. 28 return; 29 } 30 DCHECK(g_application_context.Get().is_null()); 31 g_application_context.Get().Reset(context); 32 } 33 34 } // namespace 35 GetApplicationContext()36jobject GetApplicationContext() { 37 DCHECK(!g_application_context.Get().is_null()); 38 return g_application_context.Get().obj(); 39 } 40 InitNativeSideApplicationContext(JNIEnv * env,const JavaParamRef<jclass> & clazz,const JavaParamRef<jobject> & context)41static void InitNativeSideApplicationContext( 42 JNIEnv* env, 43 const JavaParamRef<jclass>& clazz, 44 const JavaParamRef<jobject>& context) { 45 SetNativeApplicationContext(env, context); 46 } 47 RegisterContextUtils(JNIEnv * env)48bool RegisterContextUtils(JNIEnv* env) { 49 return RegisterNativesImpl(env); 50 } 51 52 } // namespace android 53 } // namespace base 54