diff options
author | Alex Blasche <alexander.blasche@digia.com> | 2014-02-26 11:08:41 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-27 13:00:50 +0100 |
commit | ccaeb6539d2f7e9ac756a7f2017c9f9e8813e265 (patch) | |
tree | 496ce956fc9408ef3fb50d34d8a4c094f3de22b9 /src/bluetooth/android/jni_android.cpp | |
parent | 9d6057f3fa0b51ee2d36ad931072d2a3c816d0a6 (diff) |
Fix crash when interrupting QBluetoothSocket's input stream thread
The previous QThread did not always properly resume when
InputStream.read() was interrupted by BluetoothSocket.close().
This patch converts the QThread to a Java thread which works
as the Android API docs suggested.
Task-number: QTBUG-37061
Change-Id: Id6ac9b57a28f3b532cbe49ff1dfdc9d1e6432aaa
Reviewed-by: Nedim Hadzic <nedimhadzija@gmail.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/bluetooth/android/jni_android.cpp')
-rw-r--r-- | src/bluetooth/android/jni_android.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index ce0f19ca..1e907fdd 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -47,6 +47,7 @@ #include <QtAndroidExtras/QAndroidJniObject> #include "android/androidbroadcastreceiver_p.h" #include "android/serveracceptancethread_p.h" +#include "android/inputstreamthread_p.h" Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) @@ -68,6 +69,19 @@ static void QtBluetoothSocketServer_newSocket(JNIEnv */*env*/, jobject /*javaObj reinterpret_cast<ServerAcceptanceThread*>(qtObject)->javaNewSocket(socket); } +static void QtBluetoothInputStreamThread_errorOccurred(JNIEnv */*env*/, jobject /*javaObject*/, + jlong qtObject, jint errorCode) +{ + reinterpret_cast<InputStreamThread*>(qtObject)->javaThreadErrorOccurred(errorCode); +} + +static void QtBluetoothInputStreamThread_readyData(JNIEnv */*env*/, jobject /*javaObject*/, + jlong qtObject, jbyteArray buffer, jint bufferLength) +{ + reinterpret_cast<InputStreamThread*>(qtObject)->javaReadyRead(buffer, bufferLength); +} + + static JNINativeMethod methods[] = { {"jniOnReceive", "(JLandroid/content/Context;Landroid/content/Intent;)V", (void *) QtBroadcastReceiver_jniOnReceive}, @@ -80,6 +94,13 @@ static JNINativeMethod methods_server[] = { (void *) QtBluetoothSocketServer_newSocket}, }; +static JNINativeMethod methods_inputStream[] = { + {"errorOccurred", "(JI)V", + (void *) QtBluetoothInputStreamThread_errorOccurred}, + {"readyData", "(J[BI)V", + (void *) QtBluetoothInputStreamThread_readyData}, +}; + static const char logTag[] = "QtBluetooth"; static const char classErrorMsg[] = "Can't find class \"%s\""; @@ -107,6 +128,13 @@ static bool registerNatives(JNIEnv *env) return false; } + FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread"); + if (env->RegisterNatives(clazz, methods_inputStream, + sizeof(methods_inputStream) / sizeof(methods_inputStream[0])) < 0) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "RegisterNatives for InputStreamThread failed"); + return false; + } + return true; } |