15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/app/android_library_loader_hooks.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/base_jni_registrar.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/android/command_line_android.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/android/jni_registrar.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/base_switches.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/app/android/app_jni_registrar.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/browser_jni_registrar.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/android/common_jni_registrar.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/content_constants_internal.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/result_codes.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/android/media_jni_registrar.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/android/net_jni_registrar.h"
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/android/ui_base_jni_registrar.h"
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/android/gfx_jni_registrar.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gl/android/gl_jni_registrar.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/shell_dialogs/android/shell_dialogs_jni_registrar.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace content {
330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool EnsureJniRegistered(JNIEnv* env) {
350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  static bool g_jni_init_done = false;
360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!g_jni_init_done) {
380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!base::android::RegisterJni(env))
390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!gfx::android::RegisterJni(env))
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!net::android::RegisterJni(env))
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!ui::android::RegisterJni(env))
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!ui::gl::android::RegisterJni(env))
510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!ui::shell_dialogs::RegisterJni(env))
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!content::android::RegisterCommonJni(env))
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!content::android::RegisterBrowserJni(env))
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!content::android::RegisterAppJni(env))
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!media::RegisterJni(env))
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return false;
670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    g_jni_init_done = true;
690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return true;
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool LibraryLoaded(JNIEnv* env, jclass clazz) {
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (command_line->HasSwitch(switches::kTraceStartup)) {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::debug::CategoryFilter category_filter(
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        command_line->GetSwitchValueASCII(switches::kTraceStartup));
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::debug::TraceLog::GetInstance()->SetEnabled(
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        category_filter,
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::debug::TraceLog::RECORDING_MODE,
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        base::debug::TraceOptions());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Android's main browser loop is custom so we set the browser
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // name here as early as possible.
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TRACE_EVENT_BEGIN_ETW("BrowserMain", 0, "");
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::debug::TraceLog::GetInstance()->SetProcessName("Browser");
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::debug::TraceLog::GetInstance()->SetProcessSortIndex(
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kTraceEventBrowserProcessSortIndex);
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can only use event tracing after setting up the command line.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TRACE_EVENT0("jni", "JNI_OnLoad continuation");
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  logging::LoggingSettings settings;
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  logging::InitLogging(settings);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // To view log output with IDs and timestamps use "adb logcat -v threadtime".
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  logging::SetLogItems(false,    // Process ID
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       false,    // Thread ID
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       false,    // Timestamp
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       false);   // Tick count
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(0) << "Chromium logging enabled: level = " << logging::GetMinLogLevel()
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << ", default verbosity = " << logging::GetVlogVerbosity();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return EnsureJniRegistered(env);
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
111