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/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