mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This updates to mojo commit d259eb58aa59 and limits the roll script to only pull in the parts of //mojo that are currently being used. More stuff will be dropped in the future.
98 lines
2.8 KiB
C++
98 lines
2.8 KiB
C++
// 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/message_pump/message_pump_mojo.h"
|
|
|
|
namespace mojo {
|
|
namespace android {
|
|
|
|
namespace {
|
|
|
|
struct MessageLoopHolder {
|
|
MessageLoopHolder() {
|
|
if (base::MessageLoop::current()) {
|
|
message_loop = base::MessageLoop::current();
|
|
owned = false;
|
|
} else {
|
|
message_loop = new base::MessageLoop(common::MessagePumpMojo::Create());
|
|
owned = true;
|
|
}
|
|
}
|
|
|
|
~MessageLoopHolder() {
|
|
if (owned) {
|
|
delete message_loop;
|
|
message_loop = nullptr;
|
|
}
|
|
}
|
|
|
|
base::MessageLoop* message_loop;
|
|
bool owned;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
static jlong CreateBaseRunLoop(JNIEnv* env, jobject jcaller) {
|
|
return reinterpret_cast<uintptr_t>(new MessageLoopHolder());
|
|
}
|
|
|
|
static void Run(JNIEnv* env, jobject jcaller, jlong runLoopID) {
|
|
reinterpret_cast<MessageLoopHolder*>(runLoopID)->message_loop->Run();
|
|
}
|
|
|
|
static void RunUntilIdle(JNIEnv* env, jobject jcaller, jlong runLoopID) {
|
|
reinterpret_cast<MessageLoopHolder*>(runLoopID)->message_loop->RunUntilIdle();
|
|
}
|
|
|
|
static void Quit(JNIEnv* env, jobject jcaller, jlong runLoopID) {
|
|
reinterpret_cast<MessageLoopHolder*>(runLoopID)->message_loop->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<MessageLoopHolder*>(runLoopID)
|
|
->message_loop->PostDelayedTask(
|
|
FROM_HERE, base::Bind(&RunJavaRunnable, runnable_ref),
|
|
base::TimeDelta::FromMicroseconds(delay));
|
|
}
|
|
|
|
static void DeleteMessageLoop(JNIEnv* env, jobject jcaller, jlong runLoopID) {
|
|
MessageLoopHolder* native_loop =
|
|
reinterpret_cast<MessageLoopHolder*>(runLoopID);
|
|
delete native_loop;
|
|
}
|
|
|
|
bool RegisterBaseRunLoop(JNIEnv* env) {
|
|
return RegisterNativesImpl(env);
|
|
}
|
|
|
|
} // namespace android
|
|
} // namespace mojo
|
|
|
|
|