• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)25 void 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()36 jobject 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)41 static void InitNativeSideApplicationContext(
42     JNIEnv* env,
43     const JavaParamRef<jclass>& clazz,
44     const JavaParamRef<jobject>& context) {
45   SetNativeApplicationContext(env, context);
46 }
47 
RegisterContextUtils(JNIEnv * env)48 bool RegisterContextUtils(JNIEnv* env) {
49   return RegisterNativesImpl(env);
50 }
51 
52 }  // namespace android
53 }  // namespace base
54