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) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool LibraryLoaded(JNIEnv* env, jclass clazz, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jobjectArray init_command_line) { 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::android::InitNativeCommandLineFromJavaArray(env, init_command_line); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_line->HasSwitch(switches::kTraceStartup)) { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::debug::CategoryFilter category_filter( 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) command_line->GetSwitchValueASCII(switches::kTraceStartup)); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::debug::TraceLog::GetInstance()->SetEnabled(category_filter, 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::TraceLog::RECORDING_MODE, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::debug::TraceLog::RECORD_UNTIL_FULL); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Android's main browser loop is custom so we set the browser 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // name here as early as possible. 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TRACE_EVENT_BEGIN_ETW("BrowserMain", 0, ""); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::TraceLog::GetInstance()->SetProcessName("Browser"); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::debug::TraceLog::GetInstance()->SetProcessSortIndex( 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kTraceEventBrowserProcessSortIndex); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can only use event tracing after setting up the command line. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("jni", "JNI_OnLoad continuation"); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch logging::LoggingSettings settings; 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch logging::InitLogging(settings); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To view log output with IDs and timestamps use "adb logcat -v threadtime". 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::SetLogItems(false, // Process ID 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, // Thread ID 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false, // Timestamp 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); // Tick count 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(0) << "Chromium logging enabled: level = " << logging::GetMinLogLevel() 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", default verbosity = " << logging::GetVlogVerbosity(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return EnsureJniRegistered(env); 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 113