1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_utils.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include "base/android/jni_string.h" 8*6777b538SAndroid Build Coastguard Worker #include "base/android/scoped_java_ref.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/containers/flat_map.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h" 12*6777b538SAndroid Build Coastguard Worker #include "build/robolectric_buildflags.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ROBOLECTRIC) 15*6777b538SAndroid Build Coastguard Worker #include "base/base_robolectric_jni/JNIUtils_jni.h" // nogncheck 16*6777b538SAndroid Build Coastguard Worker #else 17*6777b538SAndroid Build Coastguard Worker #include "base/base_jni/JNIUtils_jni.h" 18*6777b538SAndroid Build Coastguard Worker #endif 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace base { 21*6777b538SAndroid Build Coastguard Worker namespace android { 22*6777b538SAndroid Build Coastguard Worker GetSplitClassLoader(JNIEnv * env,const char * split_name)23*6777b538SAndroid Build Coastguard Workerjobject GetSplitClassLoader(JNIEnv* env, const char* split_name) { 24*6777b538SAndroid Build Coastguard Worker struct LockAndMap { 25*6777b538SAndroid Build Coastguard Worker base::Lock lock; 26*6777b538SAndroid Build Coastguard Worker base::flat_map<const char*, ScopedJavaGlobalRef<jobject>> map; 27*6777b538SAndroid Build Coastguard Worker }; 28*6777b538SAndroid Build Coastguard Worker static base::NoDestructor<LockAndMap> lock_and_map; 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker base::AutoLock guard(lock_and_map->lock); 31*6777b538SAndroid Build Coastguard Worker auto it = lock_and_map->map.find(split_name); 32*6777b538SAndroid Build Coastguard Worker if (it != lock_and_map->map.end()) { 33*6777b538SAndroid Build Coastguard Worker return it->second.obj(); 34*6777b538SAndroid Build Coastguard Worker } 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker ScopedJavaGlobalRef<jobject> class_loader(Java_JNIUtils_getSplitClassLoader( 37*6777b538SAndroid Build Coastguard Worker env, ConvertUTF8ToJavaString(env, split_name))); 38*6777b538SAndroid Build Coastguard Worker jobject class_loader_obj = class_loader.obj(); 39*6777b538SAndroid Build Coastguard Worker lock_and_map->map.insert({split_name, std::move(class_loader)}); 40*6777b538SAndroid Build Coastguard Worker return class_loader_obj; 41*6777b538SAndroid Build Coastguard Worker } 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker } // namespace android 44*6777b538SAndroid Build Coastguard Worker } // namespace base 45*6777b538SAndroid Build Coastguard Worker 46