Skip to content
Permalink
Browse files

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.
  • Loading branch information
philippwiesemann committed Nov 23, 2013
1 parent e9af6dc commit c933166401c3f28bd2d2259808c8369bdf75c6c0
Showing with 29 additions and 1 deletion.
  1. +28 −0 android-project/src/org/libsdl/app/SDLActivity.java
  2. +1 −1 src/core/android/SDL_android.c
@@ -277,6 +277,34 @@ public static Context getContext() {
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
@@ -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);

0 comments on commit c933166

Please sign in to comment.