| Index: mojo/android/system/base_run_loop.cc
|
| diff --git a/mojo/android/system/base_run_loop.cc b/mojo/android/system/base_run_loop.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..df33f01a3c2720c9af58f7078e30e102752ea6f1
|
| --- /dev/null
|
| +++ b/mojo/android/system/base_run_loop.cc
|
| @@ -0,0 +1,72 @@
|
| +// Copyright 2015 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 "mojo/android/system/base_run_loop.h"
|
| +
|
| +#include <jni.h>
|
| +
|
| +#include "base/android/base_jni_registrar.h"
|
| +#include "base/android/jni_android.h"
|
| +#include "base/android/jni_registrar.h"
|
| +#include "base/bind.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "jni/BaseRunLoop_jni.h"
|
| +#include "mojo/common/message_pump_mojo.h"
|
| +
|
| +namespace mojo {
|
| +namespace android {
|
| +
|
| +static jlong CreateBaseRunLoop(JNIEnv* env, jobject jcaller) {
|
| + base::MessageLoop* message_loop =
|
| + new base::MessageLoop(common::MessagePumpMojo::Create());
|
| + return reinterpret_cast<uintptr_t>(message_loop);
|
| +}
|
| +
|
| +static void Run(JNIEnv* env, jobject jcaller, jlong runLoopID) {
|
| + reinterpret_cast<base::MessageLoop*>(runLoopID)->Run();
|
| +}
|
| +
|
| +static void RunUntilIdle(JNIEnv* env, jobject jcaller, jlong runLoopID) {
|
| + reinterpret_cast<base::MessageLoop*>(runLoopID)->RunUntilIdle();
|
| +}
|
| +
|
| +static void Quit(JNIEnv* env, jobject jcaller, jlong runLoopID) {
|
| + reinterpret_cast<base::MessageLoop*>(runLoopID)->Quit();
|
| +}
|
| +
|
| +static void RunJavaRunnable(
|
| + const base::android::ScopedJavaGlobalRef<jobject>& runnable_ref) {
|
| + Java_BaseRunLoop_runRunnable(base::android::AttachCurrentThread(),
|
| + runnable_ref.obj());
|
| +}
|
| +
|
| +static void PostDelayedTask(JNIEnv* env,
|
| + jobject jcaller,
|
| + jlong runLoopID,
|
| + jobject runnable,
|
| + jlong delay) {
|
| + base::android::ScopedJavaGlobalRef<jobject> runnable_ref;
|
| + // ScopedJavaGlobalRef do not hold onto the env reference, so it is safe to
|
| + // use it across threads. |RunJavaRunnable| will acquire a new JNIEnv before
|
| + // running the Runnable.
|
| + runnable_ref.Reset(env, runnable);
|
| + reinterpret_cast<base::MessageLoop*>(runLoopID)->PostDelayedTask(
|
| + FROM_HERE, base::Bind(&RunJavaRunnable, runnable_ref),
|
| + base::TimeDelta::FromMicroseconds(delay));
|
| +}
|
| +
|
| +static void DeleteMessageLoop(JNIEnv* env, jobject jcaller, jlong runLoopID) {
|
| + base::MessageLoop* message_loop =
|
| + reinterpret_cast<base::MessageLoop*>(runLoopID);
|
| + delete message_loop;
|
| +}
|
| +
|
| +bool RegisterBaseRunLoop(JNIEnv* env) {
|
| + return RegisterNativesImpl(env);
|
| +}
|
| +
|
| +} // namespace android
|
| +} // namespace mojo
|
| +
|
| +
|
|
|