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.
4
5 #include "base/android/library_loader/library_loader_hooks.h"
6
7 #include "base/android/command_line_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/at_exit.h"
10 #include "base/metrics/histogram.h"
11 #include "jni/LibraryLoader_jni.h"
12
13 namespace base {
14 namespace android {
15
16 namespace {
17
18 base::AtExitManager* g_at_exit_manager = NULL;
19 const char* g_library_version_number = "";
20 LibraryLoadedHook* g_registration_callback = NULL;
21
22 } // namespace
23
SetLibraryLoadedHook(LibraryLoadedHook * func)24 void SetLibraryLoadedHook(LibraryLoadedHook* func) {
25 g_registration_callback = func;
26 }
27
InitCommandLine(JNIEnv * env,jclass clazz,jobjectArray init_command_line)28 static void InitCommandLine(JNIEnv* env, jclass clazz,
29 jobjectArray init_command_line) {
30 InitNativeCommandLineFromJavaArray(env, init_command_line);
31 }
32
LibraryLoaded(JNIEnv * env,jclass clazz)33 static jboolean LibraryLoaded(JNIEnv* env, jclass clazz) {
34 if(g_registration_callback == NULL) {
35 return true;
36 }
37 return g_registration_callback(env, clazz);
38 }
39
RecordChromiumAndroidLinkerHistogram(JNIEnv * env,jclass clazz,jboolean loaded_at_fixed_address_failed,jboolean is_low_memory_device)40 static void RecordChromiumAndroidLinkerHistogram(
41 JNIEnv* env,
42 jclass clazz,
43 jboolean loaded_at_fixed_address_failed,
44 jboolean is_low_memory_device) {
45 UMA_HISTOGRAM_BOOLEAN("ChromiumAndroidLinker.LoadedAtFixedAddressFailed",
46 loaded_at_fixed_address_failed);
47 UMA_HISTOGRAM_BOOLEAN("ChromiumAndroidLinker.IsLowMemoryDevice",
48 is_low_memory_device);
49 }
50
LibraryLoaderExitHook()51 void LibraryLoaderExitHook() {
52 if (g_at_exit_manager) {
53 delete g_at_exit_manager;
54 g_at_exit_manager = NULL;
55 }
56 }
57
RegisterLibraryLoaderEntryHook(JNIEnv * env)58 bool RegisterLibraryLoaderEntryHook(JNIEnv* env) {
59 // We need the AtExitManager to be created at the very beginning.
60 g_at_exit_manager = new base::AtExitManager();
61
62 return RegisterNativesImpl(env);
63 }
64
SetVersionNumber(const char * version_number)65 void SetVersionNumber(const char* version_number) {
66 g_library_version_number = strdup(version_number);
67 }
68
GetVersionNumber(JNIEnv * env,jclass clazz)69 jstring GetVersionNumber(JNIEnv* env, jclass clazz) {
70 return ConvertUTF8ToJavaString(env, g_library_version_number).Release();
71 }
72
RecordNativeLibraryHack(JNIEnv *,jclass,jboolean usedHack)73 static void RecordNativeLibraryHack(JNIEnv*, jclass, jboolean usedHack) {
74 UMA_HISTOGRAM_BOOLEAN("LibraryLoader.NativeLibraryHack", usedHack);
75 }
76
77 } // namespace android
78 } // namespace base
79