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 13 #include "base/base_jni_headers/JNIUtils_jni.h" 14 15 namespace base { 16 namespace android { 17 GetSplitClassLoader(JNIEnv * env,const char * split_name)18jobject GetSplitClassLoader(JNIEnv* env, const char* split_name) { 19 struct LockAndMap { 20 base::Lock lock; 21 base::flat_map<const char*, ScopedJavaGlobalRef<jobject>> map; 22 }; 23 static base::NoDestructor<LockAndMap> lock_and_map; 24 25 base::AutoLock guard(lock_and_map->lock); 26 auto it = lock_and_map->map.find(split_name); 27 if (it != lock_and_map->map.end()) { 28 return it->second.obj(); 29 } 30 31 ScopedJavaGlobalRef<jobject> class_loader(Java_JNIUtils_getSplitClassLoader( 32 env, ConvertUTF8ToJavaString(env, split_name))); 33 jobject class_loader_obj = class_loader.obj(); 34 lock_and_map->map.insert({split_name, std::move(class_loader)}); 35 return class_loader_obj; 36 } 37 38 } // namespace android 39 } // namespace base 40 41