Chromium Code Reviews| Index: services/android/java_handler.cc |
| diff --git a/services/android/java_handler.cc b/services/android/java_handler.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..89a8a4073eeaacc1a512814ba73475041b2c1e3e |
| --- /dev/null |
| +++ b/services/android/java_handler.cc |
| @@ -0,0 +1,96 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "services/android/java_handler.h" |
| + |
| +#include "base/android/jni_android.h" |
| +#include "base/android/jni_string.h" |
| +#include "base/files/file_path.h" |
| +#include "base/logging.h" |
| +#include "base/scoped_native_library.h" |
| +#include "jni/JavaHandler_jni.h" |
| +#include "mojo/android/system/base_run_loop.h" |
| +#include "mojo/android/system/core_impl.h" |
| +#include "mojo/application/application_runner_chromium.h" |
| +#include "mojo/application/content_handler_factory.h" |
| +#include "mojo/common/data_pipe_utils.h" |
| +#include "mojo/public/c/system/main.h" |
| +#include "mojo/public/cpp/application/application_impl.h" |
| + |
| +using base::android::AttachCurrentThread; |
| +using base::android::ScopedJavaLocalRef; |
| +using base::android::ConvertJavaStringToUTF8; |
| +using base::android::ConvertUTF8ToJavaString; |
| +using base::android::GetApplicationContext; |
| + |
| +namespace services { |
| +namespace android { |
| +JavaHandler::JavaHandler() : content_handler_factory_(this) { |
| +} |
| + |
| +JavaHandler::~JavaHandler() { |
| +} |
| + |
| +void JavaHandler::RunApplication( |
| + mojo::InterfaceRequest<mojo::Application> application_request, |
| + mojo::URLResponsePtr response) { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + ScopedJavaLocalRef<jstring> j_archive_path = |
| + Java_JavaHandler_getNewTempLibraryPath(env, GetApplicationContext()); |
| + base::FilePath archive_path( |
| + base::android::ConvertJavaStringToUTF8(env, j_archive_path.obj())); |
| + |
| + mojo::common::BlockingCopyToFile(response->body.Pass(), archive_path); |
| + |
| + jobject context = base::android::GetApplicationContext(); |
| + Java_JavaHandler_bootstrap( |
| + env, context, j_archive_path.obj(), |
| + application_request.PassMessagePipe().release().value()); |
| +} |
| + |
| +void JavaHandler::Initialize(mojo::ApplicationImpl* app) { |
| +} |
| + |
| +bool JavaHandler::ConfigureIncomingConnection( |
| + mojo::ApplicationConnection* connection) { |
| + connection->AddService(&content_handler_factory_); |
| + return true; |
| +} |
| + |
| +bool RegisterJavaHandlerJni(JNIEnv* env) { |
| + return RegisterNativesImpl(env); |
| +} |
| + |
| +} // namespace android |
| +} // namespace services |
| + |
| +MojoResult MojoMain(MojoHandle shell_handle) { |
| + mojo::ApplicationRunnerChromium runner(new services::android::JavaHandler()); |
| + return runner.Run(shell_handle); |
| +} |
| + |
| +JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { |
| + base::android::InitVM(vm); |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + |
| + if (!services::android::RegisterJavaHandlerJni(env)) |
| + return -1; |
| + |
| + if (!mojo::android::RegisterCoreImpl(env)) |
| + return -1; |
| + |
| + if (!mojo::android::RegisterBaseRunLoop(env)) |
| + return -1; |
| + |
| + return JNI_VERSION_1_4; |
| +} |
| + |
| +// This is needed only if the application actually needs to access the |
| +// application context. |
|
qsr
2015/02/05 16:50:08
s/only if/because/
etiennej
2015/02/06 16:22:29
Done.
|
| +extern "C" JNI_EXPORT void InitApplicationContext( |
| + const base::android::JavaRef<jobject>& context) { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + base::android::InitApplicationContext(env, context); |
| +} |
| + |