diff options
Diffstat (limited to 'src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp')
-rw-r--r-- | src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp | 133 |
1 files changed, 60 insertions, 73 deletions
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp b/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp index 3fa480acb..b581fe255 100644 --- a/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp +++ b/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp @@ -1,6 +1,6 @@ -/**************************************************************************** +/**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Toolkit. @@ -39,29 +39,24 @@ #include "androidmediametadataretriever_p.h" -#include <QtCore/private/qjnihelpers_p.h> -#include <QtCore/private/qjni_p.h> #include <QtCore/QUrl> #include <qdebug.h> +#include <QtCore/qcoreapplication.h> QT_BEGIN_NAMESPACE -static bool exceptionCheckAndClear(JNIEnv *env) +static bool exceptionCheckAndClear() { - if (Q_UNLIKELY(env->ExceptionCheck())) { #ifdef QT_DEBUG - env->ExceptionDescribe(); + return QJniEnvironment().checkAndClearExceptions(QJniEnvironment::OutputMode::Verbose); +#else + return QJniEnvironment().checkAndClearExceptions(); #endif // QT_DEBUG - env->ExceptionClear(); - return true; - } - - return false; } AndroidMediaMetadataRetriever::AndroidMediaMetadataRetriever() { - m_metadataRetriever = QJNIObjectPrivate("android/media/MediaMetadataRetriever"); + m_metadataRetriever = QJniObject("android/media/MediaMetadataRetriever"); } AndroidMediaMetadataRetriever::~AndroidMediaMetadataRetriever() @@ -73,7 +68,7 @@ QString AndroidMediaMetadataRetriever::extractMetadata(MetadataKey key) { QString value; - QJNIObjectPrivate metadata = m_metadataRetriever.callObjectMethod("extractMetadata", + QJniObject metadata = m_metadataRetriever.callObjectMethod("extractMetadata", "(I)Ljava/lang/String;", jint(key)); if (metadata.isValid()) @@ -95,95 +90,87 @@ bool AndroidMediaMetadataRetriever::setDataSource(const QUrl &url) if (!m_metadataRetriever.isValid()) return false; - QJNIEnvironmentPrivate env; - + QJniEnvironment env; if (url.isLocalFile()) { // also includes qrc files (copied to a temp file by QMediaPlayer) - QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.path()); - QJNIObjectPrivate fileInputStream("java/io/FileInputStream", - "(Ljava/lang/String;)V", - string.object()); + QJniObject string = QJniObject::fromString(url.path()); + QJniObject fileInputStream("java/io/FileInputStream", + "(Ljava/lang/String;)V", + string.object()); - if (exceptionCheckAndClear(env)) + if (!fileInputStream.isValid()) return false; - QJNIObjectPrivate fd = fileInputStream.callObjectMethod("getFD", - "()Ljava/io/FileDescriptor;"); - if (exceptionCheckAndClear(env)) { + QJniObject fd = fileInputStream.callObjectMethod("getFD", + "()Ljava/io/FileDescriptor;"); + if (!fd.isValid()) { fileInputStream.callMethod<void>("close"); - exceptionCheckAndClear(env); return false; } - m_metadataRetriever.callMethod<void>("setDataSource", - "(Ljava/io/FileDescriptor;)V", - fd.object()); - - bool ok = !exceptionCheckAndClear(env); - + auto methodId = env->GetMethodID(m_metadataRetriever.objectClass(), "setDataSource", + "(Ljava/io/FileDescriptor;)V"); + env->CallVoidMethod(m_metadataRetriever.object(), methodId, fd.object()); + bool ok = !exceptionCheckAndClear(); fileInputStream.callMethod<void>("close"); - exceptionCheckAndClear(env); - if (!ok) return false; } else if (url.scheme() == QLatin1String("assets")) { - QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.path().mid(1)); // remove first '/' - QJNIObjectPrivate activity(QtAndroidPrivate::activity()); - QJNIObjectPrivate assetManager = activity.callObjectMethod("getAssets", - "()Landroid/content/res/AssetManager;"); - QJNIObjectPrivate assetFd = assetManager.callObjectMethod("openFd", - "(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;", - string.object()); - if (exceptionCheckAndClear(env)) + QJniObject string = QJniObject::fromString(url.path().mid(1)); // remove first '/' + QJniObject activity(QNativeInterface::QAndroidApplication::context()); + QJniObject assetManager = activity.callObjectMethod("getAssets", + "()Landroid/content/res/AssetManager;"); + QJniObject assetFd = assetManager.callObjectMethod("openFd", + "(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;", + string.object()); + if (!assetFd.isValid()) return false; - QJNIObjectPrivate fd = assetFd.callObjectMethod("getFileDescriptor", + QJniObject fd = assetFd.callObjectMethod("getFileDescriptor", "()Ljava/io/FileDescriptor;"); - if (exceptionCheckAndClear(env)) { + if (!fd.isValid()) { assetFd.callMethod<void>("close"); - exceptionCheckAndClear(env); return false; } - m_metadataRetriever.callMethod<void>("setDataSource", - "(Ljava/io/FileDescriptor;JJ)V", - fd.object(), - assetFd.callMethod<jlong>("getStartOffset"), - assetFd.callMethod<jlong>("getLength")); - - bool ok = !exceptionCheckAndClear(env); - + auto methodId = env->GetMethodID(m_metadataRetriever.objectClass(), "setDataSource", + "(Ljava/io/FileDescriptor;JJ)V"); + env->CallVoidMethod(m_metadataRetriever.object(), methodId, + fd.object(), + assetFd.callMethod<jlong>("getStartOffset"), + assetFd.callMethod<jlong>("getLength")); + bool ok = !exceptionCheckAndClear(); assetFd.callMethod<void>("close"); - exceptionCheckAndClear(env); if (!ok) return false; - } else if (QtAndroidPrivate::androidSdkVersion() >= 14) { + } else if (QNativeInterface::QAndroidApplication::sdkVersion() >= 14) { // On API levels >= 14, only setDataSource(String, Map<String, String>) accepts remote media - QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.toString(QUrl::FullyEncoded)); - QJNIObjectPrivate hash("java/util/HashMap"); - - m_metadataRetriever.callMethod<void>("setDataSource", - "(Ljava/lang/String;Ljava/util/Map;)V", - string.object(), - hash.object()); - if (exceptionCheckAndClear(env)) + QJniObject string = QJniObject::fromString(url.toString(QUrl::FullyEncoded)); + QJniObject hash("java/util/HashMap"); + + auto methodId = env->GetMethodID(m_metadataRetriever.objectClass(), "setDataSource", + "(Ljava/lang/String;Ljava/util/Map;)V"); + env->CallVoidMethod(m_metadataRetriever.object(), methodId, + string.object(), hash.object()); + if (exceptionCheckAndClear()) return false; } else { // While on API levels < 14, only setDataSource(Context, Uri) is available and works for // remote media... - QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.toString(QUrl::FullyEncoded)); - QJNIObjectPrivate uri = m_metadataRetriever.callStaticObjectMethod("android/net/Uri", - "parse", - "(Ljava/lang/String;)Landroid/net/Uri;", - string.object()); - if (exceptionCheckAndClear(env)) + QJniObject string = QJniObject::fromString(url.toString(QUrl::FullyEncoded)); + QJniObject uri = m_metadataRetriever.callStaticObjectMethod( + "android/net/Uri", + "parse", + "(Ljava/lang/String;)Landroid/net/Uri;", + string.object()); + if (!uri.isValid()) return false; - m_metadataRetriever.callMethod<void>("setDataSource", - "(Landroid/content/Context;Landroid/net/Uri;)V", - QtAndroidPrivate::activity(), - uri.object()); - if (exceptionCheckAndClear(env)) + auto methodId = env->GetMethodID(m_metadataRetriever.objectClass(), "setDataSource", + "(Landroid/content/Context;Landroid/net/Uri;)V"); + env->CallVoidMethod(m_metadataRetriever.object(), methodId, + QNativeInterface::QAndroidApplication::context(), uri.object()); + if (exceptionCheckAndClear()) return false; } |