@@ -13,6 +13,31 @@ namespace fml {
1313
1414static constexpr int kClockType = CLOCK_MONOTONIC;
1515
16+ static fml::jni::ScopedJavaGlobalRef<jclass>* g_looper_class = nullptr ;
17+ static jmethodID g_looper_prepare_method_ = nullptr ;
18+ static jmethodID g_looper_loop_method_ = nullptr ;
19+ static jmethodID g_looper_my_looper_method_ = nullptr ;
20+ static jmethodID g_looper_quit_method_ = nullptr ;
21+
22+ static void LooperPrepare () {
23+ JNIEnv* env = fml::jni::AttachCurrentThread ();
24+ env->CallStaticVoidMethod (g_looper_class->obj (), g_looper_prepare_method_);
25+ }
26+
27+ static void LooperLoop () {
28+ JNIEnv* env = fml::jni::AttachCurrentThread ();
29+ env->CallStaticVoidMethod (g_looper_class->obj (), g_looper_loop_method_);
30+ }
31+
32+ static void LooperQuit () {
33+ JNIEnv* env = fml::jni::AttachCurrentThread ();
34+ auto my_looper = env->CallStaticObjectMethod (g_looper_class->obj (),
35+ g_looper_my_looper_method_);
36+ if (my_looper != nullptr ) {
37+ env->CallVoidMethod (my_looper, g_looper_quit_method_);
38+ }
39+ }
40+
1641static ALooper* AcquireLooperForThread () {
1742 ALooper* looper = ALooper_forThread ();
1843
@@ -63,23 +88,13 @@ void MessageLoopAndroid::Run() {
6388 FML_DCHECK (looper_.get () == ALooper_forThread ());
6489
6590 running_ = true ;
66-
67- while (running_) {
68- int result = ::ALooper_pollOnce (-1 , // infinite timeout
69- nullptr , // out fd,
70- nullptr , // out events,
71- nullptr // out data
72- );
73- if (result == ALOOPER_POLL_TIMEOUT || result == ALOOPER_POLL_ERROR) {
74- // This handles the case where the loop is terminated using ALooper APIs.
75- running_ = false ;
76- }
77- }
91+ LooperPrepare ();
92+ LooperLoop ();
7893}
7994
8095void MessageLoopAndroid::Terminate () {
8196 running_ = false ;
82- ALooper_wake (looper_. get () );
97+ LooperQuit ( );
8398}
8499
85100void MessageLoopAndroid::WakeUp (fml::TimePoint time_point) {
@@ -93,4 +108,33 @@ void MessageLoopAndroid::OnEventFired() {
93108 }
94109}
95110
111+ bool MessageLoopAndroid::Register (JNIEnv* env) {
112+ jclass clazz = env->FindClass (" android/os/Looper" );
113+
114+ if (clazz == nullptr ) {
115+ return false ;
116+ }
117+
118+ g_looper_class = new fml::jni::ScopedJavaGlobalRef<jclass>(env, clazz);
119+
120+ FML_CHECK (!g_looper_class->is_null ());
121+
122+ g_looper_prepare_method_ =
123+ env->GetStaticMethodID (g_looper_class->obj (), " prepare" , " ()V" );
124+ FML_CHECK (g_looper_prepare_method_ != nullptr );
125+
126+ g_looper_loop_method_ =
127+ env->GetStaticMethodID (g_looper_class->obj (), " loop" , " ()V" );
128+ FML_CHECK (g_looper_loop_method_ != nullptr );
129+
130+ g_looper_my_looper_method_ = env->GetStaticMethodID (
131+ g_looper_class->obj (), " myLooper" , " ()Landroid/os/Looper;" );
132+ FML_CHECK (g_looper_my_looper_method_ != nullptr );
133+
134+ g_looper_quit_method_ =
135+ env->GetMethodID (g_looper_class->obj (), " quit" , " ()V" );
136+
137+ return true ;
138+ }
139+
96140} // namespace fml
0 commit comments