1 // Copyright 2015 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "mojo/android/system/base_run_loop.h" 6 7 #include <jni.h> 8 9 #include "base/android/base_jni_registrar.h" 10 #include "base/android/jni_android.h" 11 #include "base/android/jni_registrar.h" 12 #include "base/bind.h" 13 #include "base/message_loop/message_loop.h" 14 #include "jni/BaseRunLoop_jni.h" 15 #include "mojo/message_pump/message_pump_mojo.h" 16 17 namespace mojo { 18 namespace android { 19 20 static jlong CreateBaseRunLoop(JNIEnv* env, 21 const JavaParamRef<jobject>& jcaller) { 22 base::MessageLoop* message_loop = 23 new base::MessageLoop(common::MessagePumpMojo::Create()); 24 return reinterpret_cast<uintptr_t>(message_loop); 25 } 26 27 static void Run(JNIEnv* env, 28 const JavaParamRef<jobject>& jcaller, 29 jlong runLoopID) { 30 reinterpret_cast<base::MessageLoop*>(runLoopID)->Run(); 31 } 32 33 static void RunUntilIdle(JNIEnv* env, 34 const JavaParamRef<jobject>& jcaller, 35 jlong runLoopID) { 36 reinterpret_cast<base::MessageLoop*>(runLoopID)->RunUntilIdle(); 37 } 38 39 static void Quit(JNIEnv* env, 40 const JavaParamRef<jobject>& jcaller, 41 jlong runLoopID) { 42 reinterpret_cast<base::MessageLoop*>(runLoopID)->QuitWhenIdle(); 43 } 44 45 static void RunJavaRunnable( 46 const base::android::ScopedJavaGlobalRef<jobject>& runnable_ref) { 47 Java_BaseRunLoop_runRunnable(base::android::AttachCurrentThread(), 48 runnable_ref.obj()); 49 } 50 51 static void PostDelayedTask(JNIEnv* env, 52 const JavaParamRef<jobject>& jcaller, 53 jlong runLoopID, 54 const JavaParamRef<jobject>& runnable, 55 jlong delay) { 56 base::android::ScopedJavaGlobalRef<jobject> runnable_ref; 57 // ScopedJavaGlobalRef do not hold onto the env reference, so it is safe to 58 // use it across threads. |RunJavaRunnable| will acquire a new JNIEnv before 59 // running the Runnable. 60 runnable_ref.Reset(env, runnable); 61 reinterpret_cast<base::MessageLoop*>(runLoopID)->PostDelayedTask( 62 FROM_HERE, base::Bind(&RunJavaRunnable, runnable_ref), 63 base::TimeDelta::FromMicroseconds(delay)); 64 } 65 66 static void DeleteMessageLoop(JNIEnv* env, 67 const JavaParamRef<jobject>& jcaller, 68 jlong runLoopID) { 69 base::MessageLoop* message_loop = 70 reinterpret_cast<base::MessageLoop*>(runLoopID); 71 delete message_loop; 72 } 73 74 bool RegisterBaseRunLoop(JNIEnv* env) { 75 return RegisterNativesImpl(env); 76 } 77 78 } // namespace android 79 } // namespace mojo 80 81 82