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