• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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