1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2015 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/base_jni_onload.h"
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_android.h"
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/jni_utils.h"
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/android/library_loader/library_loader_hooks.h"
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/bind.h"
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace base {
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace android {
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace {
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool RegisterJNI(JNIEnv* env) {
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return RegisterLibraryLoaderEntryHook(env);
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool Init() {
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  InitAtExitManager();
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  JNIEnv* env = base::android::AttachCurrentThread();
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  base::android::InitReplacementClassLoader(env,
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                                            base::android::GetClassLoader(env));
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return true;
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool OnJNIOnLoadRegisterJNI(JavaVM* vm,
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                            std::vector<RegisterCallback> callbacks) {
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  base::android::InitVM(vm);
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  JNIEnv* env = base::android::AttachCurrentThread();
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  callbacks.push_back(base::Bind(&RegisterJNI));
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  for (std::vector<RegisterCallback>::reverse_iterator i =
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez           callbacks.rbegin(); i != callbacks.rend(); ++i) {
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    if (!i->Run(env))
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      return false;
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return true;
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool OnJNIOnLoadInit(std::vector<InitCallback> callbacks) {
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  callbacks.push_back(base::Bind(&Init));
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  for (std::vector<InitCallback>::reverse_iterator i =
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez           callbacks.rbegin(); i != callbacks.rend(); ++i) {
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    if (!i->Run())
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez      return false;
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  return true;
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace android
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace base
58