xref: /aosp_15_r20/external/cronet/base/android/jni_utils.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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)23 jobject 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