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/jni_string.h" 8 #include "base/at_exit.h" 9 #include "base/metrics/histogram.h" 10 #include "jni/LibraryLoader_jni.h" 11 12 namespace base { 13 namespace android { 14 15 namespace { 16 17 base::AtExitManager* g_at_exit_manager = NULL; 18 const char* g_library_version_number = ""; 19 LibraryLoadedHook* g_registration_callback = NULL; 20 21 } // namespace 22 23 void SetLibraryLoadedHook(LibraryLoadedHook* func) { 24 g_registration_callback = func; 25 } 26 27 static jboolean LibraryLoaded(JNIEnv* env, jclass clazz, 28 jobjectArray init_command_line) { 29 if(g_registration_callback == NULL) { 30 return true; 31 } 32 return g_registration_callback(env, clazz, init_command_line); 33 } 34 35 static void RecordChromiumAndroidLinkerHistogram( 36 JNIEnv* env, 37 jclass clazz, 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); 44 } 45 46 void LibraryLoaderExitHook() { 47 if (g_at_exit_manager) { 48 delete g_at_exit_manager; 49 g_at_exit_manager = NULL; 50 } 51 } 52 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(); 56 57 return RegisterNativesImpl(env); 58 } 59 60 void SetVersionNumber(const char* version_number) { 61 g_library_version_number = strdup(version_number); 62 } 63 64 jstring GetVersionNumber(JNIEnv* env, jclass clazz) { 65 return ConvertUTF8ToJavaString(env, g_library_version_number).Release(); 66 } 67 68 static void RecordNativeLibraryHack(JNIEnv*, jclass, jboolean usedHack) { 69 UMA_HISTOGRAM_BOOLEAN("LibraryLoader.NativeLibraryHack", usedHack); 70 } 71 72 } // namespace android 73 } // namespace base 74