forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Making a way to create thread with a Java Looper for Android
We need to create a new message loop type for this as for testing the Android UI message pump type is not the standard Java, but gets overridden to a different one that can handle nested message loops. Using the new Java thread for the java bridge thread, so the thread used for AJI callbacks will have a prepared Looper. BUG=b/8680913 TBR=jochen@chromium.org Review URL: https://chromiumcodereview.appspot.com/18584006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@216349 0039d316-1c4b-4281-b951-d872f2087c98
- Loading branch information
kristianm@chromium.org
committed
Aug 8, 2013
1 parent
29aaa27
commit 349ad58
Showing
11 changed files
with
188 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
41 changes: 41 additions & 0 deletions
41
base/android/java/src/org/chromium/base/JavaHandlerThread.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// Copyright 2013 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. | ||
|
||
package org.chromium.base; | ||
|
||
import android.os.Handler; | ||
import android.os.HandlerThread; | ||
import android.os.Looper; | ||
import android.os.Message; | ||
|
||
/** | ||
* This class is an internal detail of the native counterpart. | ||
* It is instantiated and owned by the native object. | ||
*/ | ||
@JNINamespace("base::android") | ||
class JavaHandlerThread { | ||
final HandlerThread mThread; | ||
|
||
private JavaHandlerThread(String name) { | ||
mThread = new HandlerThread(name); | ||
} | ||
|
||
@CalledByNative | ||
private static JavaHandlerThread create(String name) { | ||
return new JavaHandlerThread(name); | ||
} | ||
|
||
@CalledByNative | ||
private void start(final int nativeThread, final int nativeEvent) { | ||
mThread.start(); | ||
new Handler(mThread.getLooper()).post(new Runnable() { | ||
@Override | ||
public void run() { | ||
nativeInitializeThread(nativeThread, nativeEvent); | ||
} | ||
}); | ||
} | ||
|
||
private native void nativeInitializeThread(int nativeJavaHandlerThread, int nativeEvent); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
// Copyright 2013 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 "base/android/java_handler_thread.h" | ||
|
||
#include <jni.h> | ||
|
||
#include "base/android/jni_android.h" | ||
#include "base/android/jni_string.h" | ||
#include "base/message_loop/message_loop.h" | ||
#include "base/synchronization/waitable_event.h" | ||
#include "base/threading/thread_restrictions.h" | ||
#include "jni/JavaHandlerThread_jni.h" | ||
|
||
namespace base { | ||
|
||
namespace android { | ||
|
||
JavaHandlerThread::JavaHandlerThread(const char* name) { | ||
JNIEnv* env = base::android::AttachCurrentThread(); | ||
|
||
java_thread_.Reset(Java_JavaHandlerThread_create( | ||
env, ConvertUTF8ToJavaString(env, name).Release())); | ||
} | ||
|
||
JavaHandlerThread::~JavaHandlerThread() { | ||
} | ||
|
||
void JavaHandlerThread::Start() { | ||
// Check the thread has not already been started. | ||
DCHECK(!message_loop_); | ||
|
||
JNIEnv* env = base::android::AttachCurrentThread(); | ||
base::WaitableEvent initialize_event(false, false); | ||
Java_JavaHandlerThread_start(env, | ||
java_thread_.obj(), | ||
reinterpret_cast<jint>(this), | ||
reinterpret_cast<jint>(&initialize_event)); | ||
// Wait for thread to be initialized so it is ready to be used when Start | ||
// returns. | ||
base::ThreadRestrictions::ScopedAllowWait wait_allowed; | ||
initialize_event.Wait(); | ||
} | ||
|
||
void JavaHandlerThread::Stop() { | ||
} | ||
|
||
void JavaHandlerThread::InitializeThread(JNIEnv* env, jobject obj, jint event) { | ||
// TYPE_JAVA to get the Android java style message loop. | ||
message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_JAVA)); | ||
static_cast<MessageLoopForUI*>(message_loop_.get())->Start(); | ||
reinterpret_cast<base::WaitableEvent*>(event)->Signal(); | ||
} | ||
|
||
// static | ||
bool JavaHandlerThread::RegisterBindings(JNIEnv* env) { | ||
return RegisterNativesImpl(env); | ||
} | ||
|
||
} // namespace android | ||
} // namespace base |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// Copyright 2013 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. | ||
|
||
#ifndef BASE_THREADING_JAVA_THREAD_H_ | ||
#define BASE_THREADING_JAVA_THREAD_H_ | ||
|
||
#include <jni.h> | ||
|
||
#include "base/android/scoped_java_ref.h" | ||
#include "base/memory/scoped_ptr.h" | ||
|
||
namespace base { | ||
|
||
class MessageLoop; | ||
class WaitableEvent; | ||
|
||
namespace android { | ||
|
||
// A Java Thread with a native message loop. To run tasks, post them | ||
// to the message loop and they will be scheduled along with Java tasks | ||
// on the thread. | ||
// This is useful for callbacks where the receiver expects a thread | ||
// with a prepared Looper. | ||
class BASE_EXPORT JavaHandlerThread { | ||
public: | ||
JavaHandlerThread(const char* name); | ||
virtual ~JavaHandlerThread(); | ||
|
||
base::MessageLoop* message_loop() const { return message_loop_.get(); } | ||
void Start(); | ||
void Stop(); | ||
|
||
// Called from java on the newly created thread. | ||
// Start() will not return before this methods has finished. | ||
void InitializeThread(JNIEnv* env, jobject obj, jint event); | ||
|
||
static bool RegisterBindings(JNIEnv* env); | ||
|
||
private: | ||
scoped_ptr<base::MessageLoop> message_loop_; | ||
ScopedJavaGlobalRef<jobject> java_thread_; | ||
}; | ||
|
||
} // namespace android | ||
} // namespace base | ||
|
||
#endif // BASE_THREADING_JAVA_THREAD_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters