Home | History | Annotate | Download | only in library_loader
      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