Browse Source

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.
Philipp Wiesemann 11 years ago
parent
commit
c933166401

+ 28 - 0
android-project/src/org/libsdl/app/SDLActivity.java

@@ -277,6 +277,34 @@ public class SDLActivity extends Activity {
         return mSingleton;
         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 {
     static class ShowTextInputTask implements Runnable {
         /*
         /*
          * This is used to regulate the pan&scan method to have some offset from
          * This is used to regulate the pan&scan method to have some offset from

+ 1 - 1
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;");
     mid = (*env)->GetStaticMethodID(env, mActivityClass, "getContext", "()Landroid/content/Context;");
     jobject context = (*env)->CallStaticObjectMethod(env, mActivityClass, mid);
     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);
     jobject manager = (*env)->CallObjectMethod(env, context, mid, service);
 
 
     (*env)->DeleteLocalRef(env, service);
     (*env)->DeleteLocalRef(env, service);