1 // Copyright 2014 The Chromium Authors 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/jni_utils.h" 6 7 #include "base/android/jni_string.h" 8 #include "base/android/scoped_java_ref.h" 9 #include "base/containers/flat_map.h" 10 #include "base/no_destructor.h" 11 #include "base/synchronization/lock.h" 12 #include "build/robolectric_buildflags.h" 13 14 #if BUILDFLAG(IS_ROBOLECTRIC) 15 #include "base/base_robolectric_jni/JNIUtils_jni.h" // nogncheck 16 #else 17 #include "base/base_jni/JNIUtils_jni.h" 18 #endif 19 20 namespace base { 21 namespace android { 22 GetSplitClassLoader(JNIEnv * env,const char * split_name)23jobject GetSplitClassLoader(JNIEnv* env, const char* split_name) { 24 struct LockAndMap { 25 base::Lock lock; 26 base::flat_map<const char*, ScopedJavaGlobalRef<jobject>> map; 27 }; 28 static base::NoDestructor<LockAndMap> lock_and_map; 29 30 base::AutoLock guard(lock_and_map->lock); 31 auto it = lock_and_map->map.find(split_name); 32 if (it != lock_and_map->map.end()) { 33 return it->second.obj(); 34 } 35 36 ScopedJavaGlobalRef<jobject> class_loader(Java_JNIUtils_getSplitClassLoader( 37 env, ConvertUTF8ToJavaString(env, split_name))); 38 jobject class_loader_obj = class_loader.obj(); 39 lock_and_map->map.insert({split_name, std::move(class_loader)}); 40 return class_loader_obj; 41 } 42 43 } // namespace android 44 } // namespace base 45 46