diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h index 8ccb1d398bc..a7153ae3cdd 100644 --- a/src/corelib/kernel/qjnihelpers_p.h +++ b/src/corelib/kernel/qjnihelpers_p.h @@ -22,6 +22,8 @@ QT_BEGIN_NAMESPACE +Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative") + namespace QtAndroidPrivate { class Q_CORE_EXPORT ActivityResultListener diff --git a/src/corelib/platform/android/qandroidextras.cpp b/src/corelib/platform/android/qandroidextras.cpp index 6134d5c1667..e5d91422a26 100644 --- a/src/corelib/platform/android/qandroidextras.cpp +++ b/src/corelib/platform/android/qandroidextras.cpp @@ -17,6 +17,8 @@ QT_BEGIN_NAMESPACE +using namespace QtJniTypes; + class QAndroidParcelPrivate { public: @@ -1029,8 +1031,6 @@ void QAndroidActivityCallbackResultReceiver::registerCallback( // Permissions API -static const char qtNativeClassName[] = "org/qtproject/qt/android/QtNative"; - QtAndroidPrivate::PermissionResult resultFromAndroid(jint value) { return value == 0 ? QtAndroidPrivate::Authorized : QtAndroidPrivate::Denied; @@ -1054,10 +1054,12 @@ static int nextRequestCode() Once a permission is requested, the result is braodcast by the OS and listened to by QtActivity which passes it to C++ through a native JNI method call. */ -static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint requestCode, - jobjectArray permissions, jintArray grantResults) +static void sendRequestPermissionsResult(JNIEnv *env, jobject obj, jint requestCode, + const QStringList &permissions, const QList &grantResults) { + Q_UNUSED(env); Q_UNUSED(obj); + Q_UNUSED(permissions); QMutexLocker locker(&g_pendingPermissionRequestsMutex); auto it = g_pendingPermissionRequests->constFind(requestCode); @@ -1070,18 +1072,13 @@ static void sendRequestPermissionsResult(JNIEnv *env, jobject *obj, jint request g_pendingPermissionRequests->erase(it); locker.unlock(); - const int size = env->GetArrayLength(permissions); - std::unique_ptr results(new jint[size]); - env->GetIntArrayRegion(grantResults, 0, size, results.get()); - - for (int i = 0 ; i < size; ++i) { - QtAndroidPrivate::PermissionResult result = resultFromAndroid(results[i]); - request->addResult(result, i); - } + for (qsizetype i = 0; i < grantResults.size(); ++i) + request->addResult(resultFromAndroid(grantResults.at(i)), i); QtAndroidPrivate::releaseAndroidDeadlockProtector(); request->finish(); } +Q_DECLARE_JNI_NATIVE_METHOD(sendRequestPermissionsResult) QFuture requestPermissionsInternal(const QStringList &permissions) @@ -1165,10 +1162,7 @@ QtAndroidPrivate::checkPermission(const QString &permission) { QtAndroidPrivate::PermissionResult result = Denied; if (!permission.isEmpty()) { - auto res = QJniObject::callStaticMethod(qtNativeClassName, - "checkSelfPermission", - "(Ljava/lang/String;)I", - QJniObject::fromString(permission).object()); + auto res = QtNative::callStaticMethod("checkSelfPermission", permission); result = resultFromAndroid(res); } return QtFuture::makeReadyValueFuture(result); @@ -1179,12 +1173,9 @@ bool QtAndroidPrivate::registerPermissionNatives(QJniEnvironment &env) if (QtAndroidPrivate::androidSdkVersion() < 23) return true; - const JNINativeMethod methods[] = { - {"sendRequestPermissionsResult", "(I[Ljava/lang/String;[I)V", - reinterpret_cast(sendRequestPermissionsResult) - }}; - - return env.registerNativeMethods(qtNativeClassName, methods, 1); + return env.registerNativeMethods({ + Q_JNI_NATIVE_METHOD(sendRequestPermissionsResult) + }); } QT_END_NAMESPACE diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index 6efd3fc6318..eb55e8fe3f9 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -55,7 +55,6 @@ Qt::ScreenOrientation QAndroidPlatformIntegration::m_nativeOrientation = Qt::Pri bool QAndroidPlatformIntegration::m_showPasswordEnabled = false; -Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative") Q_DECLARE_JNI_CLASS(QtDisplayManager, "org/qtproject/qt/android/QtDisplayManager") Q_DECLARE_JNI_CLASS(Display, "android/view/Display") diff --git a/src/plugins/platforms/android/qandroidplatformscreen.cpp b/src/plugins/platforms/android/qandroidplatformscreen.cpp index cc9c435a32b..5c55b86f390 100644 --- a/src/plugins/platforms/android/qandroidplatformscreen.cpp +++ b/src/plugins/platforms/android/qandroidplatformscreen.cpp @@ -55,7 +55,6 @@ Q_DECLARE_JNI_CLASS(Display, "android/view/Display") Q_DECLARE_JNI_CLASS(DisplayMetrics, "android/util/DisplayMetrics") Q_DECLARE_JNI_CLASS(Resources, "android/content/res/Resources") Q_DECLARE_JNI_CLASS(Size, "android/util/Size") -Q_DECLARE_JNI_CLASS(QtNative, "org/qtproject/qt/android/QtNative") Q_DECLARE_JNI_CLASS(QtDisplayManager, "org/qtproject/qt/android/QtDisplayManager") Q_DECLARE_JNI_CLASS(QtWindowInterface, "org/qtproject/qt/android/QtWindowInterface")