1 // Copyright 2015 The Chromium Authors. All rights reserved.
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/base_jni_onload.h"
6 
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_utils.h"
9 #include "base/android/library_loader/library_loader_hooks.h"
10 #include "base/bind.h"
11 
12 namespace base {
13 namespace android {
14 
15 namespace {
16 
RegisterJNI(JNIEnv * env)17 bool RegisterJNI(JNIEnv* env) {
18   return RegisterLibraryLoaderEntryHook(env);
19 }
20 
Init()21 bool Init() {
22   InitAtExitManager();
23   JNIEnv* env = base::android::AttachCurrentThread();
24   base::android::InitReplacementClassLoader(env,
25                                             base::android::GetClassLoader(env));
26   return true;
27 }
28 
29 }  // namespace
30 
31 
OnJNIOnLoadRegisterJNI(JavaVM * vm,std::vector<RegisterCallback> callbacks)32 bool OnJNIOnLoadRegisterJNI(JavaVM* vm,
33                             std::vector<RegisterCallback> callbacks) {
34   base::android::InitVM(vm);
35   JNIEnv* env = base::android::AttachCurrentThread();
36 
37   callbacks.push_back(base::Bind(&RegisterJNI));
38   for (std::vector<RegisterCallback>::reverse_iterator i =
39            callbacks.rbegin(); i != callbacks.rend(); ++i) {
40     if (!i->Run(env))
41       return false;
42   }
43   return true;
44 }
45 
OnJNIOnLoadInit(std::vector<InitCallback> callbacks)46 bool OnJNIOnLoadInit(std::vector<InitCallback> callbacks) {
47   callbacks.push_back(base::Bind(&Init));
48   for (std::vector<InitCallback>::reverse_iterator i =
49            callbacks.rbegin(); i != callbacks.rend(); ++i) {
50     if (!i->Run())
51       return false;
52   }
53   return true;
54 }
55 
56 }  // namespace android
57 }  // namespace base
58