summaryrefslogtreecommitdiffstats
path: root/src/bluetooth/qbluetoothsocket_android.cpp
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@theqtcompany.com>2015-02-11 07:44:36 +0100
committerAlex Blasche <alexander.blasche@theqtcompany.com>2015-02-11 07:44:46 +0100
commit3264db95f965a47f31ffe1ab768467ce827e41e9 (patch)
tree43235b62d755f1961de895e5b121362c54c33683 /src/bluetooth/qbluetoothsocket_android.cpp
parent515ccffb8d56b42c89e9c2c04abe0ef2619ece4e (diff)
parentb398e069ca8bd01ba7ca67781b7ca21402ffdbbe (diff)
Merge remote-tracking branch 'gerrit/5.4' into dev
Diffstat (limited to 'src/bluetooth/qbluetoothsocket_android.cpp')
-rw-r--r--src/bluetooth/qbluetoothsocket_android.cpp65
1 files changed, 32 insertions, 33 deletions
diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp
index 02440abc..c3380836 100644
--- a/src/bluetooth/qbluetoothsocket_android.cpp
+++ b/src/bluetooth/qbluetoothsocket_android.cpp
@@ -37,6 +37,7 @@
#include "qbluetoothaddress.h"
#include <QtCore/QLoggingCategory>
#include <QtCore/QTime>
+#include <QtCore/private/qjni_p.h>
#include <QtConcurrent/QtConcurrentRun>
#include <QtAndroidExtras/QAndroidJniEnvironment>
@@ -90,32 +91,37 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe
qCWarning(QT_BT_ANDROID) << "Falling back to workaround.";
QAndroidJniEnvironment env;
- jclass remoteDeviceClazz = env->GetObjectClass(remoteDevice.object());
- jmethodID getClassMethod = env->GetMethodID(remoteDeviceClazz, "getClass", "()Ljava/lang/Class;");
- if (!getClassMethod) {
- qCWarning(QT_BT_ANDROID) << "BluetoothDevice.getClass method could not be found.";
- return false;
- }
-
- QAndroidJniObject remoteDeviceClass = QAndroidJniObject(env->CallObjectMethod(remoteDevice.object(), getClassMethod));
+ QAndroidJniObject remoteDeviceClass = remoteDevice.callObjectMethod("getClass", "()Ljava/lang/Class;");
if (!remoteDeviceClass.isValid()) {
qCWarning(QT_BT_ANDROID) << "Could not invoke BluetoothDevice.getClass.";
return false;
}
- jclass classClass = env->FindClass("java/lang/Class");
- jclass integerClass = env->FindClass("java/lang/Integer");
- jfieldID integerType = env->GetStaticFieldID(integerClass, "TYPE", "Ljava/lang/Class;");
- jobject integerObject = env->GetStaticObjectField(integerClass, integerType);
- if (!integerObject) {
+ QAndroidJniObject integerObject = QAndroidJniObject::getStaticObjectField<jobject>(
+ "java/lang/Integer", "TYPE", "Ljava/lang/Class;");
+ if (!integerObject.isValid()) {
qCWarning(QT_BT_ANDROID) << "Could not get Integer.TYPE";
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
+
return false;
}
- jobjectArray paramTypes = env->NewObjectArray(1, classClass, integerObject);
- if (!paramTypes) {
+ jclass classClass = QJNIEnvironmentPrivate::findClass("java/lang/Class");
+ jobjectArray rawArray = env->NewObjectArray(1, classClass,
+ integerObject.object<jobject>());
+ QAndroidJniObject paramTypes(rawArray);
+ env->DeleteLocalRef(rawArray);
+ if (!paramTypes.isValid()) {
qCWarning(QT_BT_ANDROID) << "Could not create new Class[]{Integer.TYPE}";
+
+ if (env->ExceptionCheck()) {
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ }
return false;
}
@@ -143,7 +149,7 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe
"getMethod",
"(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;",
QAndroidJniObject::fromString(QLatin1String("createRfcommSocket")).object<jstring>(),
- paramTypes);
+ paramTypes.object<jobjectArray>());
if (!method.isValid() || env->ExceptionCheck()) {
qCWarning(QT_BT_ANDROID) << "Could not invoke getMethod";
if (env->ExceptionCheck()) {
@@ -153,29 +159,23 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe
return false;
}
- jclass methodClass = env->GetObjectClass(method.object());
- jmethodID invokeMethodId = env->GetMethodID(
- methodClass, "invoke",
- "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
- if (!invokeMethodId) {
- qCWarning(QT_BT_ANDROID) << "Could not invoke method.";
- return false;
- }
+ jclass objectClass = QJNIEnvironmentPrivate::findClass("java/lang/Object");
+ QAndroidJniObject channelObject = QAndroidJniObject::callStaticObjectMethod(
+ "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;", channel);
+ rawArray = env->NewObjectArray(1, objectClass, channelObject.object<jobject>());
- jmethodID valueOfMethodId = env->GetStaticMethodID(integerClass, "valueOf", "(I)Ljava/lang/Integer;");
- jclass objectClass = env->FindClass("java/lang/Object");
- jobjectArray invokeParams = env->NewObjectArray(1, objectClass, env->CallStaticObjectMethod(integerClass, valueOfMethodId, channel));
-
-
- jobject invokeResult = env->CallObjectMethod(method.object(), invokeMethodId,
- remoteDevice.object(), invokeParams);
- if (!invokeResult)
+ QAndroidJniObject invokeResult = method.callObjectMethod("invoke",
+ "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;",
+ remoteDevice.object<jobject>(), rawArray);
+ env->DeleteLocalRef(rawArray);
+ if (!invokeResult.isValid())
{
qCWarning(QT_BT_ANDROID) << "Invoke Resulted with error.";
if (env->ExceptionCheck()) {
env->ExceptionDescribe();
env->ExceptionClear();
}
+
return false;
}
@@ -186,7 +186,6 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe
env->ExceptionClear();
qCWarning(QT_BT_ANDROID) << "Socket connect via workaround failed.";
-
return false;
}