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