| 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..d26b376c891793bde21f9d50e8a91f3c33149da9
|
| --- /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 because the application needs to access the application
|
| +// context.
|
| +extern "C" JNI_EXPORT void InitApplicationContext(
|
| + const base::android::JavaRef<jobject>& context) {
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + base::android::InitApplicationContext(env, context);
|
| +}
|
| +
|
|
|