xref: /aosp_15_r20/external/libchrome/base/android/child_process_service.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_array.h"
6*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_string.h"
7*635a8641SAndroid Build Coastguard Worker #include "base/android/library_loader/library_loader_hooks.h"
8*635a8641SAndroid Build Coastguard Worker #include "base/file_descriptor_store.h"
9*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/optional.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/posix/global_descriptors.h"
13*635a8641SAndroid Build Coastguard Worker #include "jni/ChildProcessService_jni.h"
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker using base::android::JavaIntArrayToIntVector;
16*635a8641SAndroid Build Coastguard Worker using base::android::JavaParamRef;
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker namespace base {
19*635a8641SAndroid Build Coastguard Worker namespace android {
20*635a8641SAndroid Build Coastguard Worker 
JNI_ChildProcessService_RegisterFileDescriptors(JNIEnv * env,const JavaParamRef<jclass> & clazz,const JavaParamRef<jobjectArray> & j_keys,const JavaParamRef<jintArray> & j_ids,const JavaParamRef<jintArray> & j_fds,const JavaParamRef<jlongArray> & j_offsets,const JavaParamRef<jlongArray> & j_sizes)21*635a8641SAndroid Build Coastguard Worker void JNI_ChildProcessService_RegisterFileDescriptors(
22*635a8641SAndroid Build Coastguard Worker     JNIEnv* env,
23*635a8641SAndroid Build Coastguard Worker     const JavaParamRef<jclass>& clazz,
24*635a8641SAndroid Build Coastguard Worker     const JavaParamRef<jobjectArray>& j_keys,
25*635a8641SAndroid Build Coastguard Worker     const JavaParamRef<jintArray>& j_ids,
26*635a8641SAndroid Build Coastguard Worker     const JavaParamRef<jintArray>& j_fds,
27*635a8641SAndroid Build Coastguard Worker     const JavaParamRef<jlongArray>& j_offsets,
28*635a8641SAndroid Build Coastguard Worker     const JavaParamRef<jlongArray>& j_sizes) {
29*635a8641SAndroid Build Coastguard Worker   std::vector<base::Optional<std::string>> keys;
30*635a8641SAndroid Build Coastguard Worker   jsize keys_size = env->GetArrayLength(j_keys);
31*635a8641SAndroid Build Coastguard Worker   keys.reserve(keys_size);
32*635a8641SAndroid Build Coastguard Worker   for (jsize i = 0; i < keys_size; i++) {
33*635a8641SAndroid Build Coastguard Worker     base::android::ScopedJavaLocalRef<jstring> str(
34*635a8641SAndroid Build Coastguard Worker         env, static_cast<jstring>(env->GetObjectArrayElement(j_keys, i)));
35*635a8641SAndroid Build Coastguard Worker     base::Optional<std::string> key;
36*635a8641SAndroid Build Coastguard Worker     if (!str.is_null()) {
37*635a8641SAndroid Build Coastguard Worker       key = base::android::ConvertJavaStringToUTF8(env, str);
38*635a8641SAndroid Build Coastguard Worker     }
39*635a8641SAndroid Build Coastguard Worker     keys.push_back(std::move(key));
40*635a8641SAndroid Build Coastguard Worker   }
41*635a8641SAndroid Build Coastguard Worker 
42*635a8641SAndroid Build Coastguard Worker   std::vector<int> ids;
43*635a8641SAndroid Build Coastguard Worker   base::android::JavaIntArrayToIntVector(env, j_ids, &ids);
44*635a8641SAndroid Build Coastguard Worker   std::vector<int> fds;
45*635a8641SAndroid Build Coastguard Worker   base::android::JavaIntArrayToIntVector(env, j_fds, &fds);
46*635a8641SAndroid Build Coastguard Worker   std::vector<int64_t> offsets;
47*635a8641SAndroid Build Coastguard Worker   base::android::JavaLongArrayToInt64Vector(env, j_offsets, &offsets);
48*635a8641SAndroid Build Coastguard Worker   std::vector<int64_t> sizes;
49*635a8641SAndroid Build Coastguard Worker   base::android::JavaLongArrayToInt64Vector(env, j_sizes, &sizes);
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(keys.size(), ids.size());
52*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(ids.size(), fds.size());
53*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(fds.size(), offsets.size());
54*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(offsets.size(), sizes.size());
55*635a8641SAndroid Build Coastguard Worker 
56*635a8641SAndroid Build Coastguard Worker   for (size_t i = 0; i < ids.size(); i++) {
57*635a8641SAndroid Build Coastguard Worker     base::MemoryMappedFile::Region region = {offsets.at(i), sizes.at(i)};
58*635a8641SAndroid Build Coastguard Worker     const base::Optional<std::string>& key = keys.at(i);
59*635a8641SAndroid Build Coastguard Worker     int id = ids.at(i);
60*635a8641SAndroid Build Coastguard Worker     int fd = fds.at(i);
61*635a8641SAndroid Build Coastguard Worker     if (key) {
62*635a8641SAndroid Build Coastguard Worker       base::FileDescriptorStore::GetInstance().Set(*key, base::ScopedFD(fd),
63*635a8641SAndroid Build Coastguard Worker                                                    region);
64*635a8641SAndroid Build Coastguard Worker     } else {
65*635a8641SAndroid Build Coastguard Worker       base::GlobalDescriptors::GetInstance()->Set(id, fd, region);
66*635a8641SAndroid Build Coastguard Worker     }
67*635a8641SAndroid Build Coastguard Worker   }
68*635a8641SAndroid Build Coastguard Worker }
69*635a8641SAndroid Build Coastguard Worker 
JNI_ChildProcessService_ExitChildProcess(JNIEnv * env,const JavaParamRef<jclass> & clazz)70*635a8641SAndroid Build Coastguard Worker void JNI_ChildProcessService_ExitChildProcess(
71*635a8641SAndroid Build Coastguard Worker     JNIEnv* env,
72*635a8641SAndroid Build Coastguard Worker     const JavaParamRef<jclass>& clazz) {
73*635a8641SAndroid Build Coastguard Worker   VLOG(0) << "ChildProcessService: Exiting child process.";
74*635a8641SAndroid Build Coastguard Worker   base::android::LibraryLoaderExitHook();
75*635a8641SAndroid Build Coastguard Worker   _exit(0);
76*635a8641SAndroid Build Coastguard Worker }
77*635a8641SAndroid Build Coastguard Worker 
78*635a8641SAndroid Build Coastguard Worker }  // namespace android
79*635a8641SAndroid Build Coastguard Worker }  // namespace base
80