1 // Copyright 2014 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.
5 #include "base/android/library_loader/library_loader_hooks.h"
7 #include "base/android/jni_string.h"
8 #include "base/at_exit.h"
9 #include "base/metrics/histogram.h"
10 #include "jni/LibraryLoader_jni.h"
17 base::AtExitManager* g_at_exit_manager = NULL;
18 const char* g_library_version_number = "";
19 LibraryLoadedHook* g_registration_callback = NULL;
23 void SetLibraryLoadedHook(LibraryLoadedHook* func) {
24 g_registration_callback = func;
27 static jboolean LibraryLoaded(JNIEnv* env, jclass clazz,
28 jobjectArray init_command_line) {
29 if(g_registration_callback == NULL) {
32 return g_registration_callback(env, clazz, init_command_line);
35 static void RecordChromiumAndroidLinkerHistogram(
38 jboolean loaded_at_fixed_address_failed,
39 jboolean is_low_memory_device) {
40 UMA_HISTOGRAM_BOOLEAN("ChromiumAndroidLinker.LoadedAtFixedAddressFailed",
41 loaded_at_fixed_address_failed);
42 UMA_HISTOGRAM_BOOLEAN("ChromiumAndroidLinker.IsLowMemoryDevice",
43 is_low_memory_device);
46 void LibraryLoaderExitHook() {
47 if (g_at_exit_manager) {
48 delete g_at_exit_manager;
49 g_at_exit_manager = NULL;
53 bool RegisterLibraryLoaderEntryHook(JNIEnv* env) {
54 // We need the AtExitManager to be created at the very beginning.
55 g_at_exit_manager = new base::AtExitManager();
57 return RegisterNativesImpl(env);
60 void SetVersionNumber(const char* version_number) {
61 g_library_version_number = strdup(version_number);
64 jstring GetVersionNumber(JNIEnv* env, jclass clazz) {
65 return ConvertUTF8ToJavaString(env, g_library_version_number).Release();
68 static void RecordNativeLibraryHack(JNIEnv*, jclass, jboolean usedHack) {
69 UMA_HISTOGRAM_BOOLEAN("LibraryLoader.NativeLibraryHack", usedHack);
72 } // namespace android