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