summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2022-12-30 15:02:07 +0200
committerAssam Boudjelthia <assam.boudjelthia@qt.io>2023-01-18 15:47:12 +0200
commitba3db0cacdea95ca91d0b3984b4e65c43a17a9bb (patch)
treed926c96c7d51b993015a9ea6ff79a8aa2f05aee4 /src/plugins/platforms
parent7fe2537ce20ebf887d71fe0d0d0fb14b429d68be (diff)
Android: use signature-less jni syntax for AndroidContentFileEngine
Task-number: QTBUG-98974 Pick-to: 6.5 6.4 Change-Id: I1e8e102282af2877bbbe6e8018b7649fac66804e Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
Diffstat (limited to 'src/plugins/platforms')
-rw-r--r--src/plugins/platforms/android/androidcontentfileengine.cpp176
1 files changed, 92 insertions, 84 deletions
diff --git a/src/plugins/platforms/android/androidcontentfileengine.cpp b/src/plugins/platforms/android/androidcontentfileengine.cpp
index d126ea52a3..2be7c45bb2 100644
--- a/src/plugins/platforms/android/androidcontentfileengine.cpp
+++ b/src/plugins/platforms/android/androidcontentfileengine.cpp
@@ -14,12 +14,19 @@
using namespace QNativeInterface;
using namespace Qt::StringLiterals;
+Q_DECLARE_JNI_TYPE(ContentResolverType, "Landroid/content/ContentResolver;");
+Q_DECLARE_JNI_TYPE(UriType, "Landroid/net/Uri;");
+Q_DECLARE_JNI_CLASS(Uri, "android/net/Uri");
+Q_DECLARE_JNI_TYPE(ParcelFileDescriptorType, "Landroid/os/ParcelFileDescriptor;");
+Q_DECLARE_JNI_TYPE(CursorType, "Landroid/database/Cursor;");
+Q_DECLARE_JNI_TYPE(StringArray, "[Ljava/lang/String;");
+
static QJniObject &contentResolverInstance()
{
static QJniObject contentResolver;
if (!contentResolver.isValid()) {
contentResolver = QJniObject(QNativeInterface::QAndroidApplication::context())
- .callObjectMethod("getContentResolver", "()Landroid/content/ContentResolver;");
+ .callMethod<QtJniTypes::ContentResolverType>("getContentResolver");
}
return contentResolver;
@@ -70,15 +77,16 @@ bool AndroidContentFileEngine::open(QIODevice::OpenMode openMode,
openModeStr += u'a';
}
- m_pfd = contentResolverInstance().callObjectMethod("openFileDescriptor",
- "(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;",
- m_documentFile->uri().object(),
- QJniObject::fromString(openModeStr).object());
+ m_pfd = contentResolverInstance().callMethod<
+ QtJniTypes::ParcelFileDescriptorType, QtJniTypes::UriType, jstring>(
+ "openFileDescriptor",
+ m_documentFile->uri().object(),
+ QJniObject::fromString(openModeStr).object<jstring>());
if (!m_pfd.isValid())
return false;
- const auto fd = m_pfd.callMethod<jint>("getFd", "()I");
+ const auto fd = m_pfd.callMethod<jint>("getFd");
if (fd < 0) {
closeNativeFileDescriptor();
@@ -97,7 +105,7 @@ bool AndroidContentFileEngine::close()
void AndroidContentFileEngine::closeNativeFileDescriptor()
{
if (m_pfd.isValid()) {
- m_pfd.callMethod<void>("close", "()V");
+ m_pfd.callMethod<void>("close");
m_pfd = QJniObject();
}
}
@@ -332,21 +340,19 @@ public:
QVariant data(int columnIndex) const
{
- int type = m_object.callMethod<jint>("getType", "(I)I", columnIndex);
+ int type = m_object.callMethod<jint>("getType", columnIndex);
switch (type) {
case FIELD_TYPE_NULL:
return {};
case FIELD_TYPE_INTEGER:
- return QVariant::fromValue(m_object.callMethod<jlong>("getLong", "(I)J", columnIndex));
+ return QVariant::fromValue(m_object.callMethod<jlong>("getLong", columnIndex));
case FIELD_TYPE_FLOAT:
- return QVariant::fromValue(m_object.callMethod<jdouble>("getDouble", "(I)D",
- columnIndex));
+ return QVariant::fromValue(m_object.callMethod<jdouble>("getDouble", columnIndex));
case FIELD_TYPE_STRING:
- return QVariant::fromValue(m_object.callObjectMethod("getString",
- "(I)Ljava/lang/String;",
- columnIndex).toString());
+ return QVariant::fromValue(m_object.callMethod<jstring>("getString",
+ columnIndex).toString());
case FIELD_TYPE_BLOB: {
- auto blob = m_object.callObjectMethod("getBlob", "(I)[B", columnIndex);
+ auto blob = m_object.callMethod<jbyteArray>("getBlob", columnIndex);
QJniEnvironment env;
const auto blobArray = blob.object<jbyteArray>();
const int size = env->GetArrayLength(blobArray);
@@ -365,13 +371,15 @@ public:
const QStringList &selectionArgs = {},
const QString &sortOrder = {})
{
- auto cursor = contentResolverInstance().callObjectMethod("query",
- "(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;",
- uri.object(),
- projection.isEmpty() ? nullptr : fromStringList(projection).object(),
- selection.isEmpty() ? nullptr : QJniObject::fromString(selection).object(),
- selectionArgs.isEmpty() ? nullptr : fromStringList(selectionArgs).object(),
- sortOrder.isEmpty() ? nullptr : QJniObject::fromString(sortOrder).object());
+ auto cursor = contentResolverInstance().callMethod<QtJniTypes::CursorType>(
+ "query",
+ uri.object<QtJniTypes::UriType>(),
+ projection.isEmpty() ?
+ nullptr : fromStringList(projection).object<QtJniTypes::StringArray>(),
+ selection.isEmpty() ? nullptr : QJniObject::fromString(selection).object<jstring>(),
+ selectionArgs.isEmpty() ?
+ nullptr : fromStringList(selectionArgs).object<QtJniTypes::StringArray>(),
+ sortOrder.isEmpty() ? nullptr : QJniObject::fromString(sortOrder).object<jstring>());
if (!cursor.isValid())
return {};
return std::make_unique<Cursor>(cursor);
@@ -391,7 +399,7 @@ public:
bool isNull(int columnIndex) const
{
- return m_object.callMethod<jboolean>("isNull", "(I)Z", columnIndex);
+ return m_object.callMethod<jboolean>("isNull", columnIndex);
}
int columnCount() const { return m_object.callMethod<jint>("getColumnCount"); }
@@ -407,7 +415,7 @@ private:
static QJniObject fromStringList(const QStringList &list)
{
QJniEnvironment env;
- auto array = env->NewObjectArray(list.size(), env->FindClass("java/lang/String"), nullptr);
+ auto array = env->NewObjectArray(list.size(), env.findClass("java/lang/String"), nullptr);
for (int i = 0; i < list.size(); ++i)
env->SetObjectArrayElement(array, i, QJniObject::fromString(list[i]).object());
return QJniObject::fromLocalRef(array);
@@ -420,6 +428,8 @@ private:
// Start of DocumentsContract
+Q_DECLARE_JNI_CLASS(DocumentsContract, "android/provider/DocumentsContract");
+
/*!
*
* DocumentsContract Api.
@@ -452,66 +462,66 @@ const QLatin1String MIME_TYPE_DIR("vnd.android.document/directory");
QString documentId(const QJniObject &uri)
{
- return QJniObject::callStaticObjectMethod("android/provider/DocumentsContract",
- "getDocumentId",
- "(Landroid/net/Uri;)Ljava/lang/String;",
- uri.object()).toString();
+ return QJniObject::callStaticMethod<jstring, QtJniTypes::UriType>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "getDocumentId",
+ uri.object()).toString();
}
QString treeDocumentId(const QJniObject &uri)
{
- return QJniObject::callStaticObjectMethod("android/provider/DocumentsContract",
- "getTreeDocumentId",
- "(Landroid/net/Uri;)Ljava/lang/String;",
- uri.object()).toString();
+ return QJniObject::callStaticMethod<jstring, QtJniTypes::UriType>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "getTreeDocumentId",
+ uri.object()).toString();
}
QJniObject buildChildDocumentsUriUsingTree(const QJniObject &uri, const QString &parentDocumentId)
{
- return QJniObject::callStaticObjectMethod("android/provider/DocumentsContract",
- "buildChildDocumentsUriUsingTree",
- "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;",
- uri.object(),
- QJniObject::fromString(parentDocumentId).object());
+ return QJniObject::callStaticMethod<QtJniTypes::UriType>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "buildChildDocumentsUriUsingTree",
+ uri.object<QtJniTypes::UriType>(),
+ QJniObject::fromString(parentDocumentId).object<jstring>());
}
QJniObject buildDocumentUriUsingTree(const QJniObject &treeUri, const QString &documentId)
{
- return QJniObject::callStaticObjectMethod("android/provider/DocumentsContract",
- "buildDocumentUriUsingTree",
- "(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;",
- treeUri.object(),
- QJniObject::fromString(documentId).object());
+ return QJniObject::callStaticMethod<QtJniTypes::UriType>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "buildDocumentUriUsingTree",
+ treeUri.object<QtJniTypes::UriType>(),
+ QJniObject::fromString(documentId).object<jstring>());
}
bool isDocumentUri(const QJniObject &uri)
{
- return QJniObject::callStaticMethod<jboolean>("android/provider/DocumentsContract",
- "isDocumentUri",
- "(Landroid/content/Context;Landroid/net/Uri;)Z",
- QNativeInterface::QAndroidApplication::context(),
- uri.object());
+ return QJniObject::callStaticMethod<jboolean>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "isDocumentUri",
+ QNativeInterface::QAndroidApplication::context(),
+ uri.object<QtJniTypes::UriType>());
}
bool isTreeUri(const QJniObject &uri)
{
- return QJniObject::callStaticMethod<jboolean>("android/provider/DocumentsContract",
- "isTreeUri",
- "(Landroid/net/Uri;)Z",
- uri.object());
+ return QJniObject::callStaticMethod<jboolean>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "isTreeUri",
+ uri.object<QtJniTypes::UriType>());
}
QJniObject createDocument(const QJniObject &parentDocumentUri, const QString &mimeType,
const QString &displayName)
{
- return QJniObject::callStaticObjectMethod("android/provider/DocumentsContract",
- "createDocument",
- "(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;",
- contentResolverInstance().object(),
- parentDocumentUri.object(),
- QJniObject::fromString(mimeType).object(),
- QJniObject::fromString(displayName).object());
+ return QJniObject::callStaticMethod<QtJniTypes::UriType>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "createDocument",
+ contentResolverInstance().object<QtJniTypes::ContentResolverType>(),
+ parentDocumentUri.object<QtJniTypes::UriType>(),
+ QJniObject::fromString(mimeType).object<jstring>(),
+ QJniObject::fromString(displayName).object<jstring>());
}
bool deleteDocument(const QJniObject &documentUri)
@@ -520,11 +530,11 @@ bool deleteDocument(const QJniObject &documentUri)
if (!(flags & Document::FLAG_SUPPORTS_DELETE))
return {};
- return QJniObject::callStaticMethod<jboolean>("android/provider/DocumentsContract",
- "deleteDocument",
- "(Landroid/content/ContentResolver;Landroid/net/Uri;)Z",
- contentResolverInstance().object(),
- documentUri.object());
+ return QJniObject::callStaticMethod<jboolean>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "deleteDocument",
+ contentResolverInstance().object<QtJniTypes::ContentResolverType>(),
+ documentUri.object<QtJniTypes::UriType>());
}
QJniObject moveDocument(const QJniObject &sourceDocumentUri,
@@ -535,13 +545,13 @@ QJniObject moveDocument(const QJniObject &sourceDocumentUri,
if (!(flags & Document::FLAG_SUPPORTS_MOVE))
return {};
- return QJniObject::callStaticObjectMethod("android/provider/DocumentsContract",
- "moveDocument",
- "(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;",
- contentResolverInstance().object(),
- sourceDocumentUri.object(),
- sourceParentDocumentUri.object(),
- targetParentDocumentUri.object());
+ return QJniObject::callStaticMethod<QtJniTypes::UriType>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "moveDocument",
+ contentResolverInstance().object<QtJniTypes::ContentResolverType>(),
+ sourceDocumentUri.object<QtJniTypes::UriType>(),
+ sourceParentDocumentUri.object<QtJniTypes::UriType>(),
+ targetParentDocumentUri.object<QtJniTypes::UriType>());
}
QJniObject renameDocument(const QJniObject &documentUri, const QString &displayName)
@@ -550,12 +560,12 @@ QJniObject renameDocument(const QJniObject &documentUri, const QString &displayN
if (!(flags & Document::FLAG_SUPPORTS_RENAME))
return {};
- return QJniObject::callStaticObjectMethod("android/provider/DocumentsContract",
- "renameDocument",
- "(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;",
- contentResolverInstance().object(),
- documentUri.object(),
- QJniObject::fromString(displayName).object());
+ return QJniObject::callStaticMethod<QtJniTypes::UriType>(
+ QtJniTypes::className<QtJniTypes::DocumentsContract>(),
+ "renameDocument",
+ contentResolverInstance().object<QtJniTypes::ContentResolverType>(),
+ documentUri.object<QtJniTypes::UriType>(),
+ QJniObject::fromString(displayName).object<jstring>());
}
} // End DocumentsContract namespace
@@ -581,10 +591,10 @@ DocumentFile::DocumentFile(const QJniObject &uri,
QJniObject parseUri(const QString &uri)
{
- return QJniObject::callStaticObjectMethod("android/net/Uri",
- "parse",
- "(Ljava/lang/String;)Landroid/net/Uri;",
- QJniObject::fromString(uri).object());
+ return QJniObject::callStaticMethod<QtJniTypes::UriType>(
+ QtJniTypes::className<QtJniTypes::Uri>(),
+ "parse",
+ QJniObject::fromString(uri).object<jstring>());
}
DocumentFilePtr DocumentFile::parseFromAnyUri(const QString &fileName)
@@ -717,8 +727,7 @@ bool DocumentFile::canRead() const
{
const auto context = QJniObject(QNativeInterface::QAndroidApplication::context());
const bool selfUriPermission = context.callMethod<jint>("checkCallingOrSelfUriPermission",
- "(Landroid/net/Uri;I)I",
- m_uri.object(),
+ m_uri.object<QtJniTypes::UriType>(),
FLAG_GRANT_READ_URI_PERMISSION);
if (selfUriPermission != 0)
return false;
@@ -730,8 +739,7 @@ bool DocumentFile::canWrite() const
{
const auto context = QJniObject(QNativeInterface::QAndroidApplication::context());
const bool selfUriPermission = context.callMethod<jint>("checkCallingOrSelfUriPermission",
- "(Landroid/net/Uri;I)I",
- m_uri.object(),
+ m_uri.object<QtJniTypes::UriType>(),
FLAG_GRANT_WRITE_URI_PERMISSION);
if (selfUriPermission != 0)
return false;