| // Copyright 2014 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/android/jni_utils.h" |
| |
| #include "base/android/jni_string.h" |
| #include "base/android/scoped_java_ref.h" |
| #include "base/containers/flat_map.h" |
| #include "base/no_destructor.h" |
| #include "base/synchronization/lock.h" |
| |
| #include "base/base_jni_headers/JNIUtils_jni.h" |
| |
| namespace base { |
| namespace android { |
| |
| jobject GetSplitClassLoader(JNIEnv* env, const char* split_name) { |
| struct LockAndMap { |
| base::Lock lock; |
| base::flat_map<const char*, ScopedJavaGlobalRef<jobject>> map; |
| }; |
| static base::NoDestructor<LockAndMap> lock_and_map; |
| |
| base::AutoLock guard(lock_and_map->lock); |
| auto it = lock_and_map->map.find(split_name); |
| if (it != lock_and_map->map.end()) { |
| return it->second.obj(); |
| } |
| |
| ScopedJavaGlobalRef<jobject> class_loader(Java_JNIUtils_getSplitClassLoader( |
| env, ConvertUTF8ToJavaString(env, split_name))); |
| jobject class_loader_obj = class_loader.obj(); |
| lock_and_map->map.insert({split_name, std::move(class_loader)}); |
| return class_loader_obj; |
| } |
| |
| } // namespace android |
| } // namespace base |
| |