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 24 void SetLibraryLoadedHook(LibraryLoadedHook* func) { 25 g_registration_callback = func; 26 } 27 28 static void InitCommandLine(JNIEnv* env, jclass clazz, 29 jobjectArray init_command_line) { 30 InitNativeCommandLineFromJavaArray(env, init_command_line); 31 } 32 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 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 51 void LibraryLoaderExitHook() { 52 if (g_at_exit_manager) { 53 delete g_at_exit_manager; 54 g_at_exit_manager = NULL; 55 } 56 } 57 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 65 void SetVersionNumber(const char* version_number) { 66 g_library_version_number = strdup(version_number); 67 } 68 69 jstring GetVersionNumber(JNIEnv* env, jclass clazz) { 70 return ConvertUTF8ToJavaString(env, g_library_version_number).Release(); 71 } 72 73 static void RecordNativeLibraryHack(JNIEnv*, jclass, jboolean usedHack) { 74 UMA_HISTOGRAM_BOOLEAN("LibraryLoader.NativeLibraryHack", usedHack); 75 } 76 77 } // namespace android 78 } // namespace base 79