From c933166401c3f28bd2d2259808c8369bdf75c6c0 Mon Sep 17 00:00:00 2001 From: Philipp Wiesemann Date: Sat, 23 Nov 2013 23:38:16 +0100 Subject: [PATCH] Fixed bug 2258 - Crash when using Android clipboard chw The Android clipboard manager methods must be called from the UI thread, otherwise crashes of the dalvikvm happen. --- .../src/org/libsdl/app/SDLActivity.java | 28 +++++++++++++++++++ src/core/android/SDL_android.c | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index cd7b0c279..fcc623918 100755 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -277,6 +277,34 @@ public class SDLActivity extends Activity { return mSingleton; } + /** + * @return result of getSystemService(name) but executed on UI thread. + */ + public Object getSystemServiceFromUiThread(final String name) { + final Object lock = new Object(); + final Object[] results = new Object[2]; // array for writable variables + synchronized (lock) { + runOnUiThread(new Runnable() { + @Override + public void run() { + synchronized (lock) { + results[0] = getSystemService(name); + results[1] = Boolean.TRUE; + lock.notify(); + } + } + }); + if (results[1] == null) { + try { + lock.wait(); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } + } + return results[0]; + } + static class ShowTextInputTask implements Runnable { /* * This is used to regulate the pan&scan method to have some offset from diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index 549d0a897..9d044c21e 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -1041,7 +1041,7 @@ static jobject Android_JNI_GetSystemServiceObject(const char* name) mid = (*env)->GetStaticMethodID(env, mActivityClass, "getContext", "()Landroid/content/Context;"); jobject context = (*env)->CallStaticObjectMethod(env, mActivityClass, mid); - mid = (*env)->GetMethodID(env, mActivityClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); + mid = (*env)->GetMethodID(env, mActivityClass, "getSystemServiceFromUiThread", "(Ljava/lang/String;)Ljava/lang/Object;"); jobject manager = (*env)->CallObjectMethod(env, context, mid, service); (*env)->DeleteLocalRef(env, service);