summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2021-05-06 16:46:37 +0300
committerLars Knoll <lars.knoll@qt.io>2021-05-18 07:53:16 +0000
commit4a2d272886eeb4f61c4830dbe1f3a0421d167fda (patch)
tree1c716a61809b49dfc93abbf85ad3bb76e3819768 /src/multimedia
parent9c3be78dacfad5817fba1afa8bba44b1c05652d2 (diff)
Android: Use public Jni APIs as possible
* Update usage of JNI APIs (QJniObject, QJniEnvironment) * Avoid usage of QtAndroidPrivate as possible by using QNativeInterface Some instances still use native JNI APIs, because they don't yet have an alternative with the Qt public APIs, those can be fixed later. Task-number: QTBUG-93800 Change-Id: Iae0f18ef450c11a0f93133d948e78dc013c7ff3b Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/platform/android/audio/qopenslesaudioinput.cpp27
-rw-r--r--src/multimedia/platform/android/audio/qopenslesaudioinput_p.h2
-rw-r--r--src/multimedia/platform/android/audio/qopenslesengine.cpp78
-rw-r--r--src/multimedia/platform/android/common/qandroidmultimediautils.cpp40
-rw-r--r--src/multimedia/platform/android/common/qandroidmultimediautils_p.h2
-rw-r--r--src/multimedia/platform/android/common/qandroidvideooutput.cpp6
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp5
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp2
-rw-r--r--src/multimedia/platform/android/qandroidintegration.cpp14
-rw-r--r--src/multimedia/platform/android/qandroidmediadevices.cpp18
-rw-r--r--src/multimedia/platform/android/qandroidmediadevices_p.h2
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidcamera.cpp315
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidcamera_p.h8
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever.cpp133
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever_p.h8
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediaplayer.cpp102
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediaplayer_p.h8
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp161
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h12
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmultimediautils.cpp33
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidmultimediautils_p.h3
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidsurfacetexture.cpp59
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidsurfacetexture_p.h14
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp34
-rw-r--r--src/multimedia/platform/android/wrappers/jni/androidsurfaceview_p.h12
25 files changed, 477 insertions, 621 deletions
diff --git a/src/multimedia/platform/android/audio/qopenslesaudioinput.cpp b/src/multimedia/platform/android/audio/qopenslesaudioinput.cpp
index ecd4e2140..e0845a129 100644
--- a/src/multimedia/platform/android/audio/qopenslesaudioinput.cpp
+++ b/src/multimedia/platform/android/audio/qopenslesaudioinput.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.
@@ -40,14 +40,13 @@
#include "qopenslesaudioinput_p.h"
#include "qopenslesengine_p.h"
-#include <qbuffer.h>
#include <private/qaudiohelpers_p.h>
+#include <qbuffer.h>
#include <qdebug.h>
#ifdef ANDROID
#include <SLES/OpenSLES_AndroidConfiguration.h>
-#include <QtCore/private/qjnihelpers_p.h>
-#include <QtCore/private/qjni_p.h>
+#include <QtCore/qcoreapplication.h>
#endif
QT_BEGIN_NAMESPACE
@@ -59,24 +58,16 @@ QT_BEGIN_NAMESPACE
#ifdef ANDROID
static bool hasRecordingPermission()
{
- using namespace QtAndroidPrivate;
- if (androidSdkVersion() < 23)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 23)
return true;
- const QString key(QLatin1String("android.permission.RECORD_AUDIO"));
- PermissionsResult res = checkPermission(key);
- if (res == PermissionsResult::Granted) // Permission already granted?
+ const QPermission::PermisionType key(QPermission::Microphone);
+ // Permission already granted?
+ if (QCoreApplication::checkPermission(key).result() == QPermission::Authorized)
return true;
- QJNIEnvironmentPrivate env;
- const auto &results = requestPermissionsSync(env, QStringList() << key);
- if (!results.contains(key)) {
- qWarning("No permission found for key: %s", qPrintable(key));
- return false;
- }
-
- if (results[key] == PermissionsResult::Denied) {
- qDebug("%s - Permission denied by user!", qPrintable(key));
+ if (QCoreApplication::requestPermission(key).result() != QPermission::Authorized) {
+ qDebug("Microphone permission denied by user!");
return false;
}
diff --git a/src/multimedia/platform/android/audio/qopenslesaudioinput_p.h b/src/multimedia/platform/android/audio/qopenslesaudioinput_p.h
index 92494069e..e442d16af 100644
--- a/src/multimedia/platform/android/audio/qopenslesaudioinput_p.h
+++ b/src/multimedia/platform/android/audio/qopenslesaudioinput_p.h
@@ -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.
diff --git a/src/multimedia/platform/android/audio/qopenslesengine.cpp b/src/multimedia/platform/android/audio/qopenslesengine.cpp
index 878820a11..5c53e0f7b 100644
--- a/src/multimedia/platform/android/audio/qopenslesengine.cpp
+++ b/src/multimedia/platform/android/audio/qopenslesengine.cpp
@@ -44,11 +44,10 @@
#include <qdebug.h>
-#ifdef ANDROID
+#ifdef Q_OS_ANDROID
#include <SLES/OpenSLES_Android.h>
-#include <QtCore/private/qjnihelpers_p.h>
-#include <QtCore/private/qjni_p.h>
-#include <QtCore/QJniObject>
+#include <QtCore/qjniobject.h>
+#include <QtCore/qcoreapplication.h>
#endif
#define MINIMUM_PERIOD_TIME_MS 5
@@ -161,7 +160,7 @@ int QOpenSLESEngine::getOutputValue(QOpenSLESEngine::OutputValue type, int defau
#if defined(Q_OS_ANDROID)
static int sampleRate = 0;
static int framesPerBuffer = 0;
- static const int sdkVersion = QtAndroidPrivate::androidSdkVersion();
+ static const int sdkVersion = QNativeInterface::QAndroidApplication::sdkVersion();
if (sdkVersion < 17) // getProperty() was added in API level 17...
return defaultValue;
@@ -172,33 +171,34 @@ int QOpenSLESEngine::getOutputValue(QOpenSLESEngine::OutputValue type, int defau
if (type == SampleRate && sampleRate != 0)
return sampleRate;
- QJNIObjectPrivate ctx(QtAndroidPrivate::activity());
+ QJniObject ctx(QNativeInterface::QAndroidApplication::context());
if (!ctx.isValid())
return defaultValue;
- QJNIObjectPrivate audioServiceString = ctx.getStaticObjectField("android/content/Context",
- "AUDIO_SERVICE",
- "Ljava/lang/String;");
- QJNIObjectPrivate am = ctx.callObjectMethod("getSystemService",
- "(Ljava/lang/String;)Ljava/lang/Object;",
- audioServiceString.object());
+ QJniObject audioServiceString = ctx.getStaticObjectField("android/content/Context",
+ "AUDIO_SERVICE",
+ "Ljava/lang/String;");
+ QJniObject am = ctx.callObjectMethod("getSystemService",
+ "(Ljava/lang/String;)Ljava/lang/Object;",
+ audioServiceString.object());
if (!am.isValid())
return defaultValue;
- QJNIObjectPrivate sampleRateField = QJNIObjectPrivate::getStaticObjectField("android/media/AudioManager",
- "PROPERTY_OUTPUT_SAMPLE_RATE",
- "Ljava/lang/String;");
- QJNIObjectPrivate framesPerBufferField = QJNIObjectPrivate::getStaticObjectField("android/media/AudioManager",
- "PROPERTY_OUTPUT_FRAMES_PER_BUFFER",
- "Ljava/lang/String;");
-
- QJNIObjectPrivate sampleRateString = am.callObjectMethod("getProperty",
- "(Ljava/lang/String;)Ljava/lang/String;",
- sampleRateField.object());
- QJNIObjectPrivate framesPerBufferString = am.callObjectMethod("getProperty",
- "(Ljava/lang/String;)Ljava/lang/String;",
- framesPerBufferField.object());
+ auto sampleRateField = QJniObject::getStaticObjectField("android/media/AudioManager",
+ "PROPERTY_OUTPUT_SAMPLE_RATE",
+ "Ljava/lang/String;");
+ auto framesPerBufferField = QJniObject::getStaticObjectField(
+ "android/media/AudioManager",
+ "PROPERTY_OUTPUT_FRAMES_PER_BUFFER",
+ "Ljava/lang/String;");
+
+ auto sampleRateString = am.callObjectMethod("getProperty",
+ "(Ljava/lang/String;)Ljava/lang/String;",
+ sampleRateField.object());
+ auto framesPerBufferString = am.callObjectMethod("getProperty",
+ "(Ljava/lang/String;)Ljava/lang/String;",
+ framesPerBufferField.object());
if (!sampleRateString.isValid() || !framesPerBufferString.isValid())
return defaultValue;
@@ -237,7 +237,8 @@ int QOpenSLESEngine::getDefaultBufferSize(const QAudioFormat &format)
const int audioFormat = [&format]() -> int
{
- if (format.sampleFormat() == QAudioFormat::Float && QtAndroidPrivate::androidSdkVersion() >= 21)
+ const int sdkVersion = QNativeInterface::QAndroidApplication::sdkVersion();
+ if (format.sampleFormat() == QAudioFormat::Float && sdkVersion >= 21)
return 4; /* PCM_FLOAT */
else if (format.sampleFormat() == QAudioFormat::UInt8)
return 3; /* PCM_8BIT */
@@ -248,12 +249,12 @@ int QOpenSLESEngine::getDefaultBufferSize(const QAudioFormat &format)
}();
const int sampleRate = format.sampleRate();
- const int minBufferSize = QJNIObjectPrivate::callStaticMethod<jint>("android/media/AudioTrack",
- "getMinBufferSize",
- "(III)I",
- sampleRate,
- channelConfig,
- audioFormat);
+ const int minBufferSize = QJniObject::callStaticMethod<jint>("android/media/AudioTrack",
+ "getMinBufferSize",
+ "(III)I",
+ sampleRate,
+ channelConfig,
+ audioFormat);
return minBufferSize > 0 ? minBufferSize : format.bytesForDuration(DEFAULT_PERIOD_TIME_MS);
#else
return format.bytesForDuration(DEFAULT_PERIOD_TIME_MS);
@@ -274,17 +275,18 @@ bool QOpenSLESEngine::supportsLowLatency()
if (isSupported != -1)
return (isSupported == 1);
- QJNIObjectPrivate ctx(QtAndroidPrivate::activity());
+ QJniObject ctx(QNativeInterface::QAndroidApplication::context());
if (!ctx.isValid())
return false;
- QJNIObjectPrivate pm = ctx.callObjectMethod("getPackageManager", "()Landroid/content/pm/PackageManager;");
+ QJniObject pm = ctx.callObjectMethod("getPackageManager", "()Landroid/content/pm/PackageManager;");
if (!pm.isValid())
return false;
- QJNIObjectPrivate audioFeatureField = QJNIObjectPrivate::getStaticObjectField("android/content/pm/PackageManager",
- "FEATURE_AUDIO_LOW_LATENCY",
- "Ljava/lang/String;");
+ QJniObject audioFeatureField = QJniObject::getStaticObjectField(
+ "android/content/pm/PackageManager",
+ "FEATURE_AUDIO_LOW_LATENCY",
+ "Ljava/lang/String;");
if (!audioFeatureField.isValid())
return false;
@@ -357,7 +359,7 @@ bool QOpenSLESEngine::inputFormatIsSupported(SLDataFormat_PCM format)
SL_DEFAULTDEVICEID_AUDIOINPUT, NULL };
SLDataSource audioSrc = { &loc_dev, NULL };
-#ifdef ANDROID
+#ifdef Q_OS_ANDROID
SLDataLocator_AndroidSimpleBufferQueue loc_bq = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 1 };
#else
SLDataLocator_BufferQueue loc_bq = { SL_DATALOCATOR_BUFFERQUEUE, 1 };
diff --git a/src/multimedia/platform/android/common/qandroidmultimediautils.cpp b/src/multimedia/platform/android/common/qandroidmultimediautils.cpp
index 738303099..201744444 100644
--- a/src/multimedia/platform/android/common/qandroidmultimediautils.cpp
+++ b/src/multimedia/platform/android/common/qandroidmultimediautils.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.
@@ -41,8 +41,7 @@
#include "qandroidglobal_p.h"
#include <qlist.h>
-#include <QtCore/private/qjni_p.h>
-#include <QtCore/private/qjnihelpers_p.h>
+#include <QtCore/qcoreapplication.h>
QT_BEGIN_NAMESPACE
@@ -109,40 +108,39 @@ AndroidCamera::ImageFormat qt_androidImageFormatFromPixelFormat(QVideoFrameForma
}
}
-static bool androidRequestPermission(const QString &key)
+static bool androidRequestPermission(QPermission::PermisionType key)
{
- using namespace QtAndroidPrivate;
-
- if (androidSdkVersion() < 23)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 23)
return true;
- PermissionsResult res = checkPermission(key);
- if (res == PermissionsResult::Granted) // Permission already granted?
+ // Permission already granted?
+ if (QCoreApplication::checkPermission(key).result() == QPermission::Authorized)
return true;
- QJNIEnvironmentPrivate env;
- const auto &results = requestPermissionsSync(env, QStringList() << key);
- if (!results.contains(key)) {
- qCWarning(qtAndroidMediaPlugin, "No permission found for key: %s", qPrintable(key));
+ if (QCoreApplication::requestPermission(key).result() != QPermission::Authorized)
return false;
- }
-
- if (results[key] == PermissionsResult::Denied) {
- qCDebug(qtAndroidMediaPlugin, "%s - Permission denied by user!", qPrintable(key));
- return false;
- }
return true;
}
bool qt_androidRequestCameraPermission()
{
- return androidRequestPermission(QLatin1String("android.permission.CAMERA"));
+ if (!androidRequestPermission(QPermission::Camera)) {
+ qCDebug(qtAndroidMediaPlugin, "Camera permission denied by user!");
+ return false;
+ }
+
+ return true;
}
bool qt_androidRequestRecordingPermission()
{
- return androidRequestPermission(QLatin1String("android.permission.RECORD_AUDIO"));
+ if (!androidRequestPermission(QPermission::Microphone)) {
+ qCDebug(qtAndroidMediaPlugin, "Microphone permission denied by user!");
+ return false;
+ }
+
+ return true;
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/common/qandroidmultimediautils_p.h b/src/multimedia/platform/android/common/qandroidmultimediautils_p.h
index 544ae6402..db17bee82 100644
--- a/src/multimedia/platform/android/common/qandroidmultimediautils_p.h
+++ b/src/multimedia/platform/android/common/qandroidmultimediautils_p.h
@@ -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.
diff --git a/src/multimedia/platform/android/common/qandroidvideooutput.cpp b/src/multimedia/platform/android/common/qandroidvideooutput.cpp
index e0a8f16de..6f97b9fcc 100644
--- a/src/multimedia/platform/android/common/qandroidvideooutput.cpp
+++ b/src/multimedia/platform/android/common/qandroidvideooutput.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.
@@ -44,6 +44,7 @@
#include "private/qabstractvideobuffer_p.h"
#include <QVideoFrameFormat>
#include <qvideosink.h>
+#include <QtCore/qcoreapplication.h>
#include <qevent.h>
#include <qcoreapplication.h>
@@ -51,7 +52,6 @@
#include <qopenglfunctions.h>
#include <qopenglshaderprogram.h>
#include <qopenglframebufferobject.h>
-#include <QtCore/private/qjnihelpers_p.h>
#include <QtGui/QWindow>
#include <QtGui/QOffscreenSurface>
@@ -178,7 +178,7 @@ QAndroidTextureVideoOutput::QAndroidTextureVideoOutput(QObject *parent)
, m_fbo(0)
, m_program(0)
, m_glDeleter(0)
- , m_surfaceTextureCanAttachToContext(QtAndroidPrivate::androidSdkVersion() >= 16)
+ , m_surfaceTextureCanAttachToContext(QNativeInterface::QAndroidApplication::sdkVersion() >= 16)
{
}
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp
index 99de472ff..a72d4803c 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2021 The Qt Company Ltd.
** Copyright (C) 2016 Ruslan Baratov
** Contact: https://www.qt.io/licensing/
**
@@ -55,7 +55,6 @@
#include <qdebug.h>
#include <qvideoframe.h>
#include <private/qmemoryvideobuffer_p.h>
-#include <QtCore/private/qjnihelpers_p.h>
#include <private/qcamerainfo_p.h>
QT_BEGIN_NAMESPACE
@@ -391,7 +390,7 @@ bool QAndroidCameraSession::startPreview()
// Before API level 24 the orientation was always 0, which is what we're expecting, so
// we'll enforce that here.
- if (QtAndroidPrivate::androidSdkVersion() > 23)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() > 23)
m_camera->setDisplayOrientation(0);
m_camera->startPreview();
diff --git a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp
index 01d393120..9331d847f 100644
--- a/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp
+++ b/src/multimedia/platform/android/mediacapture/qandroidcapturesession.cpp
@@ -358,7 +358,7 @@ qint64 QAndroidCaptureSession::duration() const
void QAndroidCaptureSession::setEncoderSettings(const QMediaEncoderSettings &settings)
{
- const auto flag = (m_cameraSession ? QMediaEncoderSettings::ResolveFlags::RequiresVideo
+ const auto flag = m_cameraSession ? QMediaEncoderSettings::ResolveFlags::RequiresVideo
: QMediaEncoderSettings::ResolveFlags::NoFlags;
m_encoderSettings = settings;
m_encoderSettings.resolveFormat(flag);
diff --git a/src/multimedia/platform/android/qandroidintegration.cpp b/src/multimedia/platform/android/qandroidintegration.cpp
index 5786dfe19..dd04c77bc 100644
--- a/src/multimedia/platform/android/qandroidintegration.cpp
+++ b/src/multimedia/platform/android/qandroidintegration.cpp
@@ -127,17 +127,15 @@ Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_6) != JNI_OK)
return JNI_ERR;
- JNIEnv *jniEnv = uenv.nativeEnvironment;
-
- if (!AndroidMediaPlayer::initJNI(jniEnv) ||
- !AndroidCamera::initJNI(jniEnv) ||
- !AndroidMediaRecorder::initJNI(jniEnv) ||
- !AndroidSurfaceHolder::initJNI(jniEnv) ||
- !QAndroidMediaDevices::initJNI(jniEnv)) {
+ if (!AndroidMediaPlayer::registerNativeMethods()
+ || !AndroidCamera::registerNativeMethods()
+ || !AndroidMediaRecorder::registerNativeMethods()
+ || !AndroidSurfaceHolder::registerNativeMethods()
+ || !QAndroidMediaDevices::registerNativeMethods()) {
return JNI_ERR;
}
- AndroidSurfaceTexture::initJNI(jniEnv);
+ AndroidSurfaceTexture::registerNativeMethods();
return JNI_VERSION_1_6;
}
diff --git a/src/multimedia/platform/android/qandroidmediadevices.cpp b/src/multimedia/platform/android/qandroidmediadevices.cpp
index cf6a13622..d5705390f 100644
--- a/src/multimedia/platform/android/qandroidmediadevices.cpp
+++ b/src/multimedia/platform/android/qandroidmediadevices.cpp
@@ -48,12 +48,8 @@
#include "private/qplatformmediaintegration_p.h"
#include "private/qandroidcamerasession_p.h"
-#include <QtCore/private/qjnihelpers_p.h>
-
QT_BEGIN_NAMESPACE
-static char const *const QtAudioDeviceManagerClassName = "org/qtproject/qt/android/multimedia/QtAudioDeviceManager";
-
QAndroidMediaDevices::QAndroidMediaDevices()
: QPlatformMediaDevices()
{
@@ -106,19 +102,15 @@ static void onAudioOutputDevicesUpdated(JNIEnv */*env*/, jobject /*thiz*/)
QPlatformMediaIntegration::instance()->devices())->forwardAudioOutputsChanged();
}
-bool QAndroidMediaDevices::initJNI(JNIEnv *env)
+bool QAndroidMediaDevices::registerNativeMethods()
{
- jclass clazz = QJNIEnvironmentPrivate::findClass(QtAudioDeviceManagerClassName, env);
-
- static const JNINativeMethod methods[] = {
+ static JNINativeMethod methods[] = {
{"onAudioInputDevicesUpdated","()V",(void*)onAudioInputDevicesUpdated},
{"onAudioOutputDevicesUpdated", "()V",(void*)onAudioOutputDevicesUpdated}
};
-
- if (clazz && env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) != JNI_OK) {
- return false;
- }
- return true;
+ const int size = sizeof(methods) / sizeof(methods[0]);
+ return QJniEnvironment().registerNativeMethods(
+ "org/qtproject/qt/android/multimedia/QtAudioDeviceManager", methods, size);
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/qandroidmediadevices_p.h b/src/multimedia/platform/android/qandroidmediadevices_p.h
index 2f13634fe..3900c131c 100644
--- a/src/multimedia/platform/android/qandroidmediadevices_p.h
+++ b/src/multimedia/platform/android/qandroidmediadevices_p.h
@@ -71,7 +71,7 @@ public:
void forwardAudioOutputsChanged();
void forwardAudioInputsChanged();
- static bool initJNI(JNIEnv *env);
+ static bool registerNativeMethods();
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidcamera.cpp b/src/multimedia/platform/android/wrappers/jni/androidcamera.cpp
index 2cfff0e05..7800f732b 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidcamera.cpp
+++ b/src/multimedia/platform/android/wrappers/jni/androidcamera.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2021 The Qt Company Ltd.
** Copyright (C) 2016 Ruslan Baratov
** Contact: https://www.qt.io/licensing/
**
@@ -46,11 +46,11 @@
#include <qstringlist.h>
#include <qdebug.h>
-#include <QtCore/private/qjnihelpers_p.h>
#include <QtCore/qthread.h>
#include <QtCore/qreadwritelock.h>
#include <QtCore/qmutex.h>
#include <QtMultimedia/private/qmemoryvideobuffer_p.h>
+#include <QtCore/qcoreapplication.h>
#include <mutex>
@@ -62,23 +62,19 @@ typedef QHash<int, AndroidCamera *> CameraMap;
Q_GLOBAL_STATIC(CameraMap, cameras)
Q_GLOBAL_STATIC(QReadWriteLock, rwLock)
-static inline bool exceptionCheckAndClear(JNIEnv *env)
+static inline 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;
}
static QRect areaToRect(jobject areaObj)
{
- QJNIObjectPrivate area(areaObj);
- QJNIObjectPrivate rect = area.getObjectField("rect", "Landroid/graphics/Rect;");
+ QJniObject area(areaObj);
+ QJniObject rect = area.getObjectField("rect", "Landroid/graphics/Rect;");
return QRect(rect.getField<jint>("left"),
rect.getField<jint>("top"),
@@ -86,13 +82,13 @@ static QRect areaToRect(jobject areaObj)
rect.callMethod<jint>("height"));
}
-static QJNIObjectPrivate rectToArea(const QRect &rect)
+static QJniObject rectToArea(const QRect &rect)
{
- QJNIObjectPrivate jrect("android/graphics/Rect",
+ QJniObject jrect("android/graphics/Rect",
"(IIII)V",
rect.left(), rect.top(), rect.right(), rect.bottom());
- QJNIObjectPrivate area("android/hardware/Camera$Area",
+ QJniObject area("android/hardware/Camera$Area",
"(Landroid/graphics/Rect;I)V",
jrect.object(), 500);
@@ -263,10 +259,10 @@ public:
QRecursiveMutex m_parametersMutex;
QSize m_previewSize;
int m_rotation;
- QJNIObjectPrivate m_info;
- QJNIObjectPrivate m_parameters;
- QJNIObjectPrivate m_camera;
- QJNIObjectPrivate m_cameraListener;
+ QJniObject m_info;
+ QJniObject m_parameters;
+ QJniObject m_camera;
+ QJniObject m_cameraListener;
Q_SIGNALS:
void previewSizeChanged();
@@ -749,7 +745,7 @@ void AndroidCamera::fetchLastPreviewFrame()
QMetaObject::invokeMethod(d, "fetchLastPreviewFrame");
}
-QJNIObjectPrivate AndroidCamera::getCameraObject()
+QJniObject AndroidCamera::getCameraObject()
{
Q_D(AndroidCamera);
return d->m_camera;
@@ -760,7 +756,7 @@ int AndroidCamera::getNumberOfCameras()
if (!qt_androidRequestCameraPermission())
return 0;
- return QJNIObjectPrivate::callStaticMethod<jint>("android/hardware/Camera",
+ return QJniObject::callStaticMethod<jint>("android/hardware/Camera",
"getNumberOfCameras");
}
@@ -768,8 +764,8 @@ void AndroidCamera::getCameraInfo(int id, QCameraInfoPrivate *info)
{
Q_ASSERT(info);
- QJNIObjectPrivate cameraInfo("android/hardware/Camera$CameraInfo");
- QJNIObjectPrivate::callStaticMethod<void>("android/hardware/Camera",
+ QJniObject cameraInfo("android/hardware/Camera$CameraInfo");
+ QJniObject::callStaticMethod<void>("android/hardware/Camera",
"getCameraInfo",
"(ILandroid/hardware/Camera$CameraInfo;)V",
id, cameraInfo.object());
@@ -827,30 +823,30 @@ static qint32 s_activeCameras = 0;
bool AndroidCameraPrivate::init(int cameraId)
{
m_cameraId = cameraId;
- QJNIEnvironmentPrivate env;
+ QJniEnvironment env;
const bool opened = s_activeCameras & (1 << cameraId);
if (opened)
return false;
- m_camera = QJNIObjectPrivate::callStaticObjectMethod("android/hardware/Camera",
- "open",
- "(I)Landroid/hardware/Camera;",
- cameraId);
- if (exceptionCheckAndClear(env) || !m_camera.isValid())
+ m_camera = QJniObject::callStaticObjectMethod("android/hardware/Camera",
+ "open",
+ "(I)Landroid/hardware/Camera;",
+ cameraId);
+ if (!m_camera.isValid())
return false;
- m_cameraListener = QJNIObjectPrivate(QtCameraListenerClassName, "(I)V", m_cameraId);
- m_info = QJNIObjectPrivate("android/hardware/Camera$CameraInfo");
+ m_cameraListener = QJniObject(QtCameraListenerClassName, "(I)V", m_cameraId);
+ m_info = QJniObject("android/hardware/Camera$CameraInfo");
m_camera.callStaticMethod<void>("android/hardware/Camera",
"getCameraInfo",
"(ILandroid/hardware/Camera$CameraInfo;)V",
cameraId,
m_info.object());
- QJNIObjectPrivate params = m_camera.callObjectMethod("getParameters",
+ QJniObject params = m_camera.callObjectMethod("getParameters",
"()Landroid/hardware/Camera$Parameters;");
- m_parameters = QJNIObjectPrivate(params);
+ m_parameters = QJniObject(params);
s_activeCameras |= 1 << cameraId;
return true;
@@ -860,7 +856,7 @@ void AndroidCameraPrivate::release()
{
m_previewSize = QSize();
m_parametersMutex.lock();
- m_parameters = QJNIObjectPrivate();
+ m_parameters = QJniObject();
m_parametersMutex.unlock();
if (m_camera.isValid()) {
m_camera.callMethod<void>("release");
@@ -870,23 +866,35 @@ void AndroidCameraPrivate::release()
bool AndroidCameraPrivate::lock()
{
- QJNIEnvironmentPrivate env;
- m_camera.callMethod<void>("lock");
- return !exceptionCheckAndClear(env);
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_camera.objectClass(), "lock", "()V");
+ env->CallVoidMethod(m_camera.object(), methodId);
+
+ if (exceptionCheckAndClear())
+ return false;
+ return true;
}
bool AndroidCameraPrivate::unlock()
{
- QJNIEnvironmentPrivate env;
- m_camera.callMethod<void>("unlock");
- return !exceptionCheckAndClear(env);
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_camera.objectClass(), "unlock", "()V");
+ env->CallVoidMethod(m_camera.object(), methodId);
+
+ if (exceptionCheckAndClear())
+ return false;
+ return true;
}
bool AndroidCameraPrivate::reconnect()
{
- QJNIEnvironmentPrivate env;
- m_camera.callMethod<void>("reconnect");
- return !exceptionCheckAndClear(env);
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_camera.objectClass(), "reconnect", "()V");
+ env->CallVoidMethod(m_camera.object(), methodId);
+
+ if (exceptionCheckAndClear())
+ return false;
+ return true;
}
AndroidCamera::CameraFacing AndroidCameraPrivate::getFacing()
@@ -906,8 +914,8 @@ QSize AndroidCameraPrivate::getPreferredPreviewSizeForVideo()
if (!m_parameters.isValid())
return QSize();
- QJNIObjectPrivate size = m_parameters.callObjectMethod("getPreferredPreviewSizeForVideo",
- "()Landroid/hardware/Camera$Size;");
+ QJniObject size = m_parameters.callObjectMethod("getPreferredPreviewSizeForVideo",
+ "()Landroid/hardware/Camera$Size;");
if (!size.isValid())
return QSize();
@@ -922,13 +930,13 @@ QList<QSize> AndroidCameraPrivate::getSupportedPreviewSizes()
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
if (m_parameters.isValid()) {
- QJNIObjectPrivate sizeList = m_parameters.callObjectMethod("getSupportedPreviewSizes",
- "()Ljava/util/List;");
+ QJniObject sizeList = m_parameters.callObjectMethod("getSupportedPreviewSizes",
+ "()Ljava/util/List;");
int count = sizeList.callMethod<jint>("size");
for (int i = 0; i < count; ++i) {
- QJNIObjectPrivate size = sizeList.callObjectMethod("get",
- "(I)Ljava/lang/Object;",
- i);
+ QJniObject size = sizeList.callObjectMethod("get",
+ "(I)Ljava/lang/Object;",
+ i);
list.append(QSize(size.getField<jint>("width"), size.getField<jint>("height")));
}
@@ -942,21 +950,21 @@ QList<AndroidCamera::FpsRange> AndroidCameraPrivate::getSupportedPreviewFpsRange
{
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
- QJNIEnvironmentPrivate env;
+ QJniEnvironment env;
QList<AndroidCamera::FpsRange> rangeList;
if (m_parameters.isValid()) {
- QJNIObjectPrivate rangeListNative = m_parameters.callObjectMethod("getSupportedPreviewFpsRange",
- "()Ljava/util/List;");
+ QJniObject rangeListNative = m_parameters.callObjectMethod("getSupportedPreviewFpsRange",
+ "()Ljava/util/List;");
int count = rangeListNative.callMethod<jint>("size");
rangeList.reserve(count);
for (int i = 0; i < count; ++i) {
- QJNIObjectPrivate range = rangeListNative.callObjectMethod("get",
- "(I)Ljava/lang/Object;",
- i);
+ QJniObject range = rangeListNative.callObjectMethod("get",
+ "(I)Ljava/lang/Object;",
+ i);
jintArray jRange = static_cast<jintArray>(range.object());
jint* rangeArray = env->GetIntArrayElements(jRange, 0);
@@ -979,7 +987,7 @@ AndroidCamera::FpsRange AndroidCameraPrivate::getPreviewFpsRange()
{
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
- QJNIEnvironmentPrivate env;
+ QJniEnvironment env;
AndroidCamera::FpsRange range;
@@ -1007,9 +1015,8 @@ void AndroidCameraPrivate::setPreviewFpsRange(int min, int max)
if (!m_parameters.isValid())
return;
- QJNIEnvironmentPrivate env;
+ QJniEnvironment env;
m_parameters.callMethod<void>("setPreviewFpsRange", "(II)V", min, max);
- exceptionCheckAndClear(env);
}
AndroidCamera::ImageFormat AndroidCameraPrivate::getPreviewFormat()
@@ -1040,13 +1047,13 @@ QList<AndroidCamera::ImageFormat> AndroidCameraPrivate::getSupportedPreviewForma
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
if (m_parameters.isValid()) {
- QJNIObjectPrivate formatList = m_parameters.callObjectMethod("getSupportedPreviewFormats",
- "()Ljava/util/List;");
+ QJniObject formatList = m_parameters.callObjectMethod("getSupportedPreviewFormats",
+ "()Ljava/util/List;");
int count = formatList.callMethod<jint>("size");
for (int i = 0; i < count; ++i) {
- QJNIObjectPrivate format = formatList.callObjectMethod("get",
- "(I)Ljava/lang/Object;",
- i);
+ QJniObject format = formatList.callObjectMethod("get",
+ "(I)Ljava/lang/Object;",
+ i);
list.append(AndroidCamera::ImageFormat(format.callMethod<jint>("intValue")));
}
}
@@ -1061,7 +1068,7 @@ QSize AndroidCameraPrivate::getPreviewSize()
if (!m_parameters.isValid())
return QSize();
- QJNIObjectPrivate size = m_parameters.callObjectMethod("getPreviewSize",
+ QJniObject size = m_parameters.callObjectMethod("getPreviewSize",
"()Landroid/hardware/Camera$Size;");
if (!size.isValid())
@@ -1084,20 +1091,26 @@ void AndroidCameraPrivate::updatePreviewSize()
bool AndroidCameraPrivate::setPreviewTexture(void *surfaceTexture)
{
- QJNIEnvironmentPrivate env;
- m_camera.callMethod<void>("setPreviewTexture",
- "(Landroid/graphics/SurfaceTexture;)V",
- static_cast<jobject>(surfaceTexture));
- return !exceptionCheckAndClear(env);
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_camera.objectClass(), "setPreviewTexture",
+ "(Landroid/graphics/SurfaceTexture;)V");
+ env->CallVoidMethod(m_camera.object(), methodId, static_cast<jobject>(surfaceTexture));
+
+ if (exceptionCheckAndClear())
+ return false;
+ return true;
}
bool AndroidCameraPrivate::setPreviewDisplay(void *surfaceHolder)
{
- QJNIEnvironmentPrivate env;
- m_camera.callMethod<void>("setPreviewDisplay",
- "(Landroid/view/SurfaceHolder;)V",
- static_cast<jobject>(surfaceHolder));
- return !exceptionCheckAndClear(env);
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_camera.objectClass(), "setPreviewDisplay",
+ "(Landroid/view/SurfaceHolder;)V");
+ env->CallVoidMethod(m_camera.object(), methodId, static_cast<jobject>(surfaceHolder));
+
+ if (exceptionCheckAndClear())
+ return false;
+ return true;
}
void AndroidCameraPrivate::setDisplayOrientation(int degrees)
@@ -1132,11 +1145,11 @@ QList<int> AndroidCameraPrivate::getZoomRatios()
QList<int> ratios;
if (m_parameters.isValid()) {
- QJNIObjectPrivate ratioList = m_parameters.callObjectMethod("getZoomRatios",
+ QJniObject ratioList = m_parameters.callObjectMethod("getZoomRatios",
"()Ljava/util/List;");
int count = ratioList.callMethod<jint>("size");
for (int i = 0; i < count; ++i) {
- QJNIObjectPrivate zoomRatio = ratioList.callObjectMethod("get",
+ QJniObject zoomRatio = ratioList.callObjectMethod("get",
"(I)Ljava/lang/Object;",
i);
@@ -1175,8 +1188,8 @@ QString AndroidCameraPrivate::getFlashMode()
QString value;
if (m_parameters.isValid()) {
- QJNIObjectPrivate flashMode = m_parameters.callObjectMethod("getFlashMode",
- "()Ljava/lang/String;");
+ QJniObject flashMode = m_parameters.callObjectMethod("getFlashMode",
+ "()Ljava/lang/String;");
if (flashMode.isValid())
value = flashMode.toString();
}
@@ -1193,7 +1206,7 @@ void AndroidCameraPrivate::setFlashMode(const QString &value)
m_parameters.callMethod<void>("setFlashMode",
"(Ljava/lang/String;)V",
- QJNIObjectPrivate::fromString(value).object());
+ QJniObject::fromString(value).object());
applyParameters();
}
@@ -1204,8 +1217,8 @@ QString AndroidCameraPrivate::getFocusMode()
QString value;
if (m_parameters.isValid()) {
- QJNIObjectPrivate focusMode = m_parameters.callObjectMethod("getFocusMode",
- "()Ljava/lang/String;");
+ QJniObject focusMode = m_parameters.callObjectMethod("getFocusMode",
+ "()Ljava/lang/String;");
if (focusMode.isValid())
value = focusMode.toString();
}
@@ -1222,13 +1235,14 @@ void AndroidCameraPrivate::setFocusMode(const QString &value)
m_parameters.callMethod<void>("setFocusMode",
"(Ljava/lang/String;)V",
- QJNIObjectPrivate::fromString(value).object());
+ QJniObject::fromString(value).object());
applyParameters();
}
int AndroidCameraPrivate::getMaxNumFocusAreas()
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ // FIXME qt 6 support api > 23, should this be removed then?
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return 0;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
@@ -1243,21 +1257,21 @@ QList<QRect> AndroidCameraPrivate::getFocusAreas()
{
QList<QRect> areas;
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return areas;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
if (m_parameters.isValid()) {
- QJNIObjectPrivate list = m_parameters.callObjectMethod("getFocusAreas",
- "()Ljava/util/List;");
+ QJniObject list = m_parameters.callObjectMethod("getFocusAreas",
+ "()Ljava/util/List;");
if (list.isValid()) {
int count = list.callMethod<jint>("size");
for (int i = 0; i < count; ++i) {
- QJNIObjectPrivate area = list.callObjectMethod("get",
- "(I)Ljava/lang/Object;",
- i);
+ QJniObject area = list.callObjectMethod("get",
+ "(I)Ljava/lang/Object;",
+ i);
areas.append(areaToRect(area.object()));
}
@@ -1269,7 +1283,7 @@ QList<QRect> AndroidCameraPrivate::getFocusAreas()
void AndroidCameraPrivate::setFocusAreas(const QList<QRect> &areas)
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
@@ -1277,16 +1291,15 @@ void AndroidCameraPrivate::setFocusAreas(const QList<QRect> &areas)
if (!m_parameters.isValid())
return;
- QJNIObjectPrivate list;
+ QJniObject list;
if (!areas.isEmpty()) {
- QJNIEnvironmentPrivate env;
- QJNIObjectPrivate arrayList("java/util/ArrayList", "(I)V", areas.size());
+ QJniEnvironment env;
+ QJniObject arrayList("java/util/ArrayList", "(I)V", areas.size());
for (int i = 0; i < areas.size(); ++i) {
arrayList.callMethod<jboolean>("add",
"(Ljava/lang/Object;)Z",
rectToArea(areas.at(i)).object());
- exceptionCheckAndClear(env);
}
list = arrayList;
}
@@ -1298,26 +1311,24 @@ void AndroidCameraPrivate::setFocusAreas(const QList<QRect> &areas)
void AndroidCameraPrivate::autoFocus()
{
- QJNIEnvironmentPrivate env;
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_camera.objectClass(), "autoFocus",
+ "(Landroid/hardware/Camera$AutoFocusCallback;)V");
+ env->CallVoidMethod(m_camera.object(), methodId, m_cameraListener.object());
- m_camera.callMethod<void>("autoFocus",
- "(Landroid/hardware/Camera$AutoFocusCallback;)V",
- m_cameraListener.object());
-
- if (!exceptionCheckAndClear(env))
+ if (!exceptionCheckAndClear())
emit autoFocusStarted();
}
void AndroidCameraPrivate::cancelAutoFocus()
{
- QJNIEnvironmentPrivate env;
+ QJniEnvironment env;
m_camera.callMethod<void>("cancelAutoFocus");
- exceptionCheckAndClear(env);
}
bool AndroidCameraPrivate::isAutoExposureLockSupported()
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return false;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
@@ -1330,7 +1341,7 @@ bool AndroidCameraPrivate::isAutoExposureLockSupported()
bool AndroidCameraPrivate::getAutoExposureLock()
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return false;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
@@ -1343,7 +1354,7 @@ bool AndroidCameraPrivate::getAutoExposureLock()
void AndroidCameraPrivate::setAutoExposureLock(bool toggle)
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
@@ -1357,7 +1368,7 @@ void AndroidCameraPrivate::setAutoExposureLock(bool toggle)
bool AndroidCameraPrivate::isAutoWhiteBalanceLockSupported()
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return false;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
@@ -1370,7 +1381,7 @@ bool AndroidCameraPrivate::isAutoWhiteBalanceLockSupported()
bool AndroidCameraPrivate::getAutoWhiteBalanceLock()
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return false;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
@@ -1383,7 +1394,7 @@ bool AndroidCameraPrivate::getAutoWhiteBalanceLock()
void AndroidCameraPrivate::setAutoWhiteBalanceLock(bool toggle)
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return;
const std::lock_guard<QRecursiveMutex> locker(m_parametersMutex);
@@ -1453,8 +1464,8 @@ QString AndroidCameraPrivate::getSceneMode()
QString value;
if (m_parameters.isValid()) {
- QJNIObjectPrivate sceneMode = m_parameters.callObjectMethod("getSceneMode",
- "()Ljava/lang/String;");
+ QJniObject sceneMode = m_parameters.callObjectMethod("getSceneMode",
+ "()Ljava/lang/String;");
if (sceneMode.isValid())
value = sceneMode.toString();
}
@@ -1471,7 +1482,7 @@ void AndroidCameraPrivate::setSceneMode(const QString &value)
m_parameters.callMethod<void>("setSceneMode",
"(Ljava/lang/String;)V",
- QJNIObjectPrivate::fromString(value).object());
+ QJniObject::fromString(value).object());
applyParameters();
}
@@ -1482,8 +1493,8 @@ QString AndroidCameraPrivate::getWhiteBalance()
QString value;
if (m_parameters.isValid()) {
- QJNIObjectPrivate wb = m_parameters.callObjectMethod("getWhiteBalance",
- "()Ljava/lang/String;");
+ QJniObject wb = m_parameters.callObjectMethod("getWhiteBalance",
+ "()Ljava/lang/String;");
if (wb.isValid())
value = wb.toString();
}
@@ -1500,7 +1511,7 @@ void AndroidCameraPrivate::setWhiteBalance(const QString &value)
m_parameters.callMethod<void>("setWhiteBalance",
"(Ljava/lang/String;)V",
- QJNIObjectPrivate::fromString(value).object());
+ QJniObject::fromString(value).object());
applyParameters();
emit whiteBalanceChanged();
@@ -1521,13 +1532,13 @@ QList<QSize> AndroidCameraPrivate::getSupportedPictureSizes()
QList<QSize> list;
if (m_parameters.isValid()) {
- QJNIObjectPrivate sizeList = m_parameters.callObjectMethod("getSupportedPictureSizes",
- "()Ljava/util/List;");
+ QJniObject sizeList = m_parameters.callObjectMethod("getSupportedPictureSizes",
+ "()Ljava/util/List;");
int count = sizeList.callMethod<jint>("size");
for (int i = 0; i < count; ++i) {
- QJNIObjectPrivate size = sizeList.callObjectMethod("get",
- "(I)Ljava/lang/Object;",
- i);
+ QJniObject size = sizeList.callObjectMethod("get",
+ "(I)Ljava/lang/Object;",
+ i);
list.append(QSize(size.getField<jint>("width"), size.getField<jint>("height")));
}
@@ -1561,12 +1572,13 @@ void AndroidCameraPrivate::setJpegQuality(int quality)
void AndroidCameraPrivate::startPreview()
{
- QJNIEnvironmentPrivate env;
-
setupPreviewFrameCallback();
- m_camera.callMethod<void>("startPreview");
- if (exceptionCheckAndClear(env))
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_camera.objectClass(), "startPreview", "()V");
+ env->CallVoidMethod(m_camera.object(), methodId);
+
+ if (exceptionCheckAndClear())
emit previewFailedToStart();
else
emit previewStarted();
@@ -1574,34 +1586,28 @@ void AndroidCameraPrivate::startPreview()
void AndroidCameraPrivate::stopPreview()
{
- QJNIEnvironmentPrivate env;
-
// cancel any pending new frame notification
m_cameraListener.callMethod<void>("notifyWhenFrameAvailable", "(Z)V", false);
-
m_camera.callMethod<void>("stopPreview");
-
- exceptionCheckAndClear(env);
emit previewStopped();
}
void AndroidCameraPrivate::takePicture()
{
- QJNIEnvironmentPrivate env;
-
// We must clear the preview callback before calling takePicture(), otherwise the call will
// block and the camera server will be frozen until the next device restart...
// That problem only happens on some devices and on the emulator
m_cameraListener.callMethod<void>("clearPreviewCallback", "(Landroid/hardware/Camera;)V", m_camera.object());
- m_camera.callMethod<void>("takePicture", "(Landroid/hardware/Camera$ShutterCallback;"
- "Landroid/hardware/Camera$PictureCallback;"
- "Landroid/hardware/Camera$PictureCallback;)V",
- m_cameraListener.object(),
- jobject(0),
- m_cameraListener.object());
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_camera.objectClass(), "takePicture",
+ "(Landroid/hardware/Camera$ShutterCallback;"
+ "Landroid/hardware/Camera$PictureCallback;"
+ "Landroid/hardware/Camera$PictureCallback;)V");
+ env->CallVoidMethod(m_camera.object(), methodId, m_cameraListener.object(),
+ jobject(0), m_cameraListener.object());
- if (exceptionCheckAndClear(env))
+ if (exceptionCheckAndClear())
emit takePictureFailed();
}
@@ -1617,8 +1623,8 @@ void AndroidCameraPrivate::notifyNewFrames(bool notify)
void AndroidCameraPrivate::fetchLastPreviewFrame()
{
- QJNIEnvironmentPrivate env;
- QJNIObjectPrivate data = m_cameraListener.callObjectMethod("lastPreviewBuffer", "()[B");
+ QJniEnvironment env;
+ QJniObject data = m_cameraListener.callObjectMethod("lastPreviewBuffer", "()[B");
if (!data.isValid()) {
// If there's no buffer received yet, retry when the next one arrives
@@ -1650,11 +1656,10 @@ void AndroidCameraPrivate::fetchLastPreviewFrame()
void AndroidCameraPrivate::applyParameters()
{
- QJNIEnvironmentPrivate env;
+ QJniEnvironment env;
m_camera.callMethod<void>("setParameters",
"(Landroid/hardware/Camera$Parameters;)V",
m_parameters.object());
- exceptionCheckAndClear(env);
}
QStringList AndroidCameraPrivate::callParametersStringListMethod(const QByteArray &methodName)
@@ -1664,15 +1669,15 @@ QStringList AndroidCameraPrivate::callParametersStringListMethod(const QByteArra
QStringList stringList;
if (m_parameters.isValid()) {
- QJNIObjectPrivate list = m_parameters.callObjectMethod(methodName.constData(),
- "()Ljava/util/List;");
+ QJniObject list = m_parameters.callObjectMethod(methodName.constData(),
+ "()Ljava/util/List;");
if (list.isValid()) {
int count = list.callMethod<jint>("size");
for (int i = 0; i < count; ++i) {
- QJNIObjectPrivate string = list.callObjectMethod("get",
- "(I)Ljava/lang/Object;",
- i);
+ QJniObject string = list.callObjectMethod("get",
+ "(I)Ljava/lang/Object;",
+ i);
stringList.append(string.toString());
}
}
@@ -1681,12 +1686,9 @@ QStringList AndroidCameraPrivate::callParametersStringListMethod(const QByteArra
return stringList;
}
-bool AndroidCamera::initJNI(JNIEnv *env)
+bool AndroidCamera::registerNativeMethods()
{
- jclass clazz = QJNIEnvironmentPrivate::findClass(QtCameraListenerClassName,
- env);
-
- static const JNINativeMethod methods[] = {
+ static JNINativeMethod methods[] = {
{"notifyAutoFocusComplete", "(IZ)V", (void *)notifyAutoFocusComplete},
{"notifyPictureExposed", "(I)V", (void *)notifyPictureExposed},
{"notifyPictureCaptured", "(I[B)V", (void *)notifyPictureCaptured},
@@ -1694,13 +1696,8 @@ bool AndroidCamera::initJNI(JNIEnv *env)
{"notifyFrameAvailable", "(I)V", (void *)notifyFrameAvailable}
};
- if (clazz && env->RegisterNatives(clazz,
- methods,
- sizeof(methods) / sizeof(methods[0])) != JNI_OK) {
- return false;
- }
-
- return true;
+ const int size = sizeof(methods) / sizeof(methods[0]);
+ return QJniEnvironment().registerNativeMethods(QtCameraListenerClassName, methods, size);
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidcamera_p.h b/src/multimedia/platform/android/wrappers/jni/androidcamera_p.h
index 37d353ffb..889aab2fd 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidcamera_p.h
+++ b/src/multimedia/platform/android/wrappers/jni/androidcamera_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2021 The Qt Company Ltd.
** Copyright (C) 2016 Ruslan Baratov
** Contact: https://www.qt.io/licensing/
**
@@ -53,10 +53,10 @@
//
#include <qobject.h>
-#include <QtCore/private/qjni_p.h>
#include <qsize.h>
#include <qrect.h>
#include <QtMultimedia/qcamera.h>
+#include <QtCore/qjniobject.h>
#include <private/qcamerainfo_p.h>
QT_BEGIN_NAMESPACE
@@ -200,13 +200,13 @@ public:
void setupPreviewFrameCallback();
void notifyNewFrames(bool notify);
void fetchLastPreviewFrame();
- QJNIObjectPrivate getCameraObject();
+ QJniObject getCameraObject();
static int getNumberOfCameras();
static void getCameraInfo(int id, QCameraInfoPrivate *info);
static bool requestCameraPermission();
- static bool initJNI(JNIEnv *env);
+ static bool registerNativeMethods();
Q_SIGNALS:
void previewSizeChanged();
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;
}
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever_p.h b/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever_p.h
index 8a7b75480..69727bbd3 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever_p.h
+++ b/src/multimedia/platform/android/wrappers/jni/androidmediametadataretriever_p.h
@@ -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.
@@ -51,7 +51,9 @@
// We mean it.
//
-#include <QtCore/private/qjni_p.h>
+#include <QtCore/private/qglobal_p.h>
+#include <QtCore/qurl.h>
+#include <QtCore/qjniobject.h>
QT_BEGIN_NAMESPACE
@@ -92,7 +94,7 @@ public:
private:
void release();
- QJNIObjectPrivate m_metadataRetriever;
+ QJniObject m_metadataRetriever;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediaplayer.cpp b/src/multimedia/platform/android/wrappers/jni/androidmediaplayer.cpp
index 6b5655f58..d60702cc0 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidmediaplayer.cpp
+++ b/src/multimedia/platform/android/wrappers/jni/androidmediaplayer.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.
@@ -38,13 +38,12 @@
****************************************************************************/
#include "androidmediaplayer_p.h"
-
-#include <QString>
-#include <QtCore/private/qjni_p.h>
-#include <QtCore/private/qjnihelpers_p.h>
#include "androidsurfacetexture_p.h"
+
#include <QList>
#include <QReadWriteLock>
+#include <QString>
+#include <QtCore/qcoreapplication.h>
static const char QtAndroidMediaPlayerClassName[] = "org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer";
typedef QList<AndroidMediaPlayer *> MediaPlayerList;
@@ -53,16 +52,25 @@ Q_GLOBAL_STATIC(QReadWriteLock, rwLock)
QT_BEGIN_NAMESPACE
+static bool exceptionCheckAndClear()
+{
+#ifdef QT_DEBUG
+ return QJniEnvironment().checkAndClearExceptions(QJniEnvironment::OutputMode::Verbose);
+#else
+ return QJniEnvironment().checkAndClearExceptions();
+#endif // QT_DEBUG
+}
+
AndroidMediaPlayer::AndroidMediaPlayer()
: QObject()
{
QWriteLocker locker(rwLock);
- auto context = QtAndroidPrivate::activity() ? QtAndroidPrivate::activity() : QtAndroidPrivate::service();
+ auto context = QNativeInterface::QAndroidApplication::context();
const jlong id = reinterpret_cast<jlong>(this);
- mMediaPlayer = QJNIObjectPrivate(QtAndroidMediaPlayerClassName,
- "(Landroid/content/Context;J)V",
- context,
- id);
+ mMediaPlayer = QJniObject(QtAndroidMediaPlayerClassName,
+ "(Landroid/content/Context;J)V",
+ context,
+ id);
mediaPlayers->append(this);
}
@@ -113,23 +121,20 @@ qreal AndroidMediaPlayer::playbackRate()
{
qreal rate(1.0);
- if (QtAndroidPrivate::androidSdkVersion() < 23)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 23)
return rate;
- QJNIObjectPrivate player = mMediaPlayer.callObjectMethod("getMediaPlayerHandle", "()Landroid/media/MediaPlayer;");
+ QJniObject player = mMediaPlayer.callObjectMethod("getMediaPlayerHandle",
+ "()Landroid/media/MediaPlayer;");
if (player.isValid()) {
- QJNIObjectPrivate playbackParams = player.callObjectMethod("getPlaybackParams", "()Landroid/media/PlaybackParams;");
+ QJniObject playbackParams = player.callObjectMethod("getPlaybackParams",
+ "()Landroid/media/PlaybackParams;");
if (playbackParams.isValid()) {
- const qreal speed = playbackParams.callMethod<jfloat>("getSpeed", "()F");
- QJNIEnvironmentPrivate env;
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif // QT_DEBUG
- env->ExceptionClear();
- } else {
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(playbackParams.objectClass(), "getSpeed", "()F");
+ const qreal speed = env->CallFloatMethod(playbackParams.object(), methodId);
+ if (!exceptionCheckAndClear())
rate = speed;
- }
}
}
@@ -168,13 +173,14 @@ void AndroidMediaPlayer::setMuted(bool mute)
void AndroidMediaPlayer::setDataSource(const QNetworkRequest &request)
{
- QJNIObjectPrivate string = QJNIObjectPrivate::fromString(request.url().toString(QUrl::FullyEncoded));
+ QJniObject string = QJniObject::fromString(request.url().toString(QUrl::FullyEncoded));
mMediaPlayer.callMethod<void>("initHeaders", "()V");
for (auto &header : request.rawHeaderList()) {
auto value = request.rawHeader(header);
mMediaPlayer.callMethod<void>("setHeader", "(Ljava/lang/String;Ljava/lang/String;)V",
- QJNIObjectPrivate::fromString(header).object(), QJNIObjectPrivate::fromString(value).object());
+ QJniObject::fromString(QLatin1String(header)).object(),
+ QJniObject::fromString(QLatin1String(value)).object());
}
mMediaPlayer.callMethod<void>("setDataSource", "(Ljava/lang/String;)V", string.object());
@@ -192,27 +198,31 @@ void AndroidMediaPlayer::setVolume(int volume)
bool AndroidMediaPlayer::setPlaybackRate(qreal rate)
{
- if (QtAndroidPrivate::androidSdkVersion() < 23) {
- qWarning("Setting the playback rate on a media player requires Android 6.0 (API level 23) or later");
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 23) {
+ qWarning() << "Setting the playback rate on a media player requires"
+ << "Android 6.0 (API level 23) or later";
return false;
}
- QJNIEnvironmentPrivate env;
-
- QJNIObjectPrivate player = mMediaPlayer.callObjectMethod("getMediaPlayerHandle", "()Landroid/media/MediaPlayer;");
+ QJniObject player = mMediaPlayer.callObjectMethod("getMediaPlayerHandle",
+ "()Landroid/media/MediaPlayer;");
if (player.isValid()) {
- QJNIObjectPrivate playbackParams = player.callObjectMethod("getPlaybackParams", "()Landroid/media/PlaybackParams;");
+ QJniObject playbackParams = player.callObjectMethod("getPlaybackParams",
+ "()Landroid/media/PlaybackParams;");
if (playbackParams.isValid()) {
- playbackParams.callObjectMethod("setSpeed", "(F)Landroid/media/PlaybackParams;", jfloat(rate));
+ playbackParams.callObjectMethod("setSpeed", "(F)Landroid/media/PlaybackParams;",
+ jfloat(rate));
// pitch can only be > 0
if (!qFuzzyIsNull(rate))
- playbackParams.callObjectMethod("setPitch", "(F)Landroid/media/PlaybackParams;", jfloat(qAbs(rate)));
- player.callMethod<void>("setPlaybackParams", "(Landroid/media/PlaybackParams;)V", playbackParams.object());
- if (Q_UNLIKELY(env->ExceptionCheck())) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif // QT_DEBUG
- env->ExceptionClear();
+ playbackParams.callObjectMethod("setPitch", "(F)Landroid/media/PlaybackParams;",
+ jfloat(qAbs(rate)));
+
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(player.objectClass(), "setPlaybackParams",
+ "(Landroid/media/PlaybackParams;)V");
+ env->CallVoidMethod(player.object(), methodId, playbackParams.object());
+
+ if (exceptionCheckAndClear()) {
qWarning() << "Invalid playback rate" << rate;
return false;
} else {
@@ -399,12 +409,9 @@ static void onVideoSizeChangedNative(JNIEnv *env,
Q_EMIT (*mediaPlayers)[i]->videoSizeChanged(width, height);
}
-bool AndroidMediaPlayer::initJNI(JNIEnv *env)
+bool AndroidMediaPlayer::registerNativeMethods()
{
- jclass clazz = QJNIEnvironmentPrivate::findClass(QtAndroidMediaPlayerClassName,
- env);
-
- static const JNINativeMethod methods[] = {
+ static JNINativeMethod methods[] = {
{"onErrorNative", "(IIJ)V", reinterpret_cast<void *>(onErrorNative)},
{"onBufferingUpdateNative", "(IJ)V", reinterpret_cast<void *>(onBufferingUpdateNative)},
{"onProgressUpdateNative", "(IJ)V", reinterpret_cast<void *>(onProgressUpdateNative)},
@@ -414,13 +421,8 @@ bool AndroidMediaPlayer::initJNI(JNIEnv *env)
{"onStateChangedNative", "(IJ)V", reinterpret_cast<void *>(onStateChangedNative)}
};
- if (clazz && env->RegisterNatives(clazz,
- methods,
- sizeof(methods) / sizeof(methods[0])) != JNI_OK) {
- return false;
- }
-
- return true;
+ const int size = sizeof(methods) / sizeof(methods[0]);
+ return QJniEnvironment().registerNativeMethods(QtAndroidMediaPlayerClassName, methods, size);
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediaplayer_p.h b/src/multimedia/platform/android/wrappers/jni/androidmediaplayer_p.h
index e1f6c34e4..7fb6094a1 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidmediaplayer_p.h
+++ b/src/multimedia/platform/android/wrappers/jni/androidmediaplayer_p.h
@@ -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.
@@ -53,7 +53,7 @@
#include <QObject>
#include <QNetworkRequest>
-#include <QtCore/private/qjni_p.h>
+#include <QtCore/qjniobject.h>
#include <QAudio>
QT_BEGIN_NAMESPACE
@@ -131,7 +131,7 @@ public:
void setDisplay(AndroidSurfaceTexture *surfaceTexture);
void setAudioRole(QAudio::Role role);
- static bool initJNI(JNIEnv *env);
+ static bool registerNativeMethods();
Q_SIGNALS:
void error(qint32 what, qint32 extra);
@@ -143,7 +143,7 @@ Q_SIGNALS:
void videoSizeChanged(qint32 width, qint32 height);
private:
- QJNIObjectPrivate mMediaPlayer;
+ QJniObject mMediaPlayer;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp
index 97bbd3b6a..5f99d5820 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder.cpp
+++ b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder.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.
@@ -44,14 +44,22 @@
#include "androidsurfaceview_p.h"
#include "qandroidglobal_p.h"
#include "qandroidmultimediautils_p.h"
-#include <QtCore/private/qjni_p.h>
#include <qmap.h>
QT_BEGIN_NAMESPACE
-typedef QMap<QString, QJNIObjectPrivate> CamcorderProfiles;
+typedef QMap<QString, QJniObject> CamcorderProfiles;
Q_GLOBAL_STATIC(CamcorderProfiles, g_camcorderProfiles)
+static inline bool exceptionCheckAndClear()
+{
+#ifdef QT_DEBUG
+ return QJniEnvironment().checkAndClearExceptions(QJniEnvironment::OutputMode::Verbose);
+#else
+ return QJniEnvironment().checkAndClearExceptions();
+#endif // QT_DEBUG
+}
+
static QString profileKey()
{
return QStringLiteral("%1-%2");
@@ -62,7 +70,7 @@ bool AndroidCamcorderProfile::hasProfile(jint cameraId, Quality quality)
if (g_camcorderProfiles->contains(profileKey().arg(cameraId).arg(quality)))
return true;
- return QJNIObjectPrivate::callStaticMethod<jboolean>("android/media/CamcorderProfile",
+ return QJniObject::callStaticMethod<jboolean>("android/media/CamcorderProfile",
"hasProfile",
"(II)Z",
cameraId,
@@ -72,12 +80,12 @@ bool AndroidCamcorderProfile::hasProfile(jint cameraId, Quality quality)
AndroidCamcorderProfile AndroidCamcorderProfile::get(jint cameraId, Quality quality)
{
const QString key = profileKey().arg(cameraId).arg(quality);
- QMap<QString, QJNIObjectPrivate>::const_iterator it = g_camcorderProfiles->constFind(key);
+ QMap<QString, QJniObject>::const_iterator it = g_camcorderProfiles->constFind(key);
if (it != g_camcorderProfiles->constEnd())
return AndroidCamcorderProfile(*it);
- QJNIObjectPrivate camProfile = QJNIObjectPrivate::callStaticObjectMethod("android/media/CamcorderProfile",
+ QJniObject camProfile = QJniObject::callStaticObjectMethod("android/media/CamcorderProfile",
"get",
"(II)Landroid/media/CamcorderProfile;",
cameraId,
@@ -118,7 +126,7 @@ int AndroidCamcorderProfile::getValue(AndroidCamcorderProfile::Field field) cons
return 0;
}
-AndroidCamcorderProfile::AndroidCamcorderProfile(const QJNIObjectPrivate &camcorderProfile)
+AndroidCamcorderProfile::AndroidCamcorderProfile(const QJniObject &camcorderProfile)
{
m_camcorderProfile = camcorderProfile;
}
@@ -145,9 +153,9 @@ AndroidMediaRecorder::AndroidMediaRecorder()
: QObject()
, m_id(reinterpret_cast<jlong>(this))
{
- m_mediaRecorder = QJNIObjectPrivate("android/media/MediaRecorder");
+ m_mediaRecorder = QJniObject("android/media/MediaRecorder");
if (m_mediaRecorder.isValid()) {
- QJNIObjectPrivate listener(QtMediaRecorderListenerClassName, "(J)V", m_id);
+ QJniObject listener(QtMediaRecorderListenerClassName, "(J)V", m_id);
m_mediaRecorder.callMethod<void>("setOnErrorListener",
"(Landroid/media/MediaRecorder$OnErrorListener;)V",
listener.object());
@@ -170,15 +178,12 @@ void AndroidMediaRecorder::release()
bool AndroidMediaRecorder::prepare()
{
- QJNIEnvironmentPrivate env;
- m_mediaRecorder.callMethod<void>("prepare");
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_mediaRecorder.objectClass(), "prepare", "()V");
+ env->CallVoidMethod(m_mediaRecorder.object(), methodId);
+
+ if (exceptionCheckAndClear())
return false;
- }
return true;
}
@@ -189,28 +194,18 @@ void AndroidMediaRecorder::reset()
bool AndroidMediaRecorder::start()
{
- QJNIEnvironmentPrivate env;
- m_mediaRecorder.callMethod<void>("start");
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
+ QJniEnvironment env;
+ auto methodId = env->GetMethodID(m_mediaRecorder.objectClass(), "start", "()V");
+ env->CallVoidMethod(m_mediaRecorder.object(), methodId);
+
+ if (exceptionCheckAndClear())
return false;
- }
return true;
}
void AndroidMediaRecorder::stop()
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("stop");
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setAudioChannels(int numChannels)
@@ -220,14 +215,8 @@ void AndroidMediaRecorder::setAudioChannels(int numChannels)
void AndroidMediaRecorder::setAudioEncoder(AudioEncoder encoder)
{
- QJNIEnvironmentPrivate env;
+ QJniEnvironment env;
m_mediaRecorder.callMethod<void>("setAudioEncoder", "(I)V", int(encoder));
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setAudioEncodingBitRate(int bitRate)
@@ -242,32 +231,18 @@ void AndroidMediaRecorder::setAudioSamplingRate(int samplingRate)
void AndroidMediaRecorder::setAudioSource(AudioSource source)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setAudioSource", "(I)V", int(source));
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setCamera(AndroidCamera *camera)
{
- QJNIObjectPrivate cam = camera->getCameraObject();
+ QJniObject cam = camera->getCameraObject();
m_mediaRecorder.callMethod<void>("setCamera", "(Landroid/hardware/Camera;)V", cam.object());
}
void AndroidMediaRecorder::setVideoEncoder(VideoEncoder encoder)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setVideoEncoder", "(I)V", int(encoder));
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setVideoEncodingBitRate(int bitRate)
@@ -277,97 +252,47 @@ void AndroidMediaRecorder::setVideoEncodingBitRate(int bitRate)
void AndroidMediaRecorder::setVideoFrameRate(int rate)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setVideoFrameRate", "(I)V", rate);
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setVideoSize(const QSize &size)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setVideoSize", "(II)V", size.width(), size.height());
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setVideoSource(VideoSource source)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setVideoSource", "(I)V", int(source));
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setOrientationHint(int degrees)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setOrientationHint", "(I)V", degrees);
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setOutputFormat(OutputFormat format)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setOutputFormat", "(I)V", int(format));
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setOutputFile(const QString &path)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setOutputFile",
"(Ljava/lang/String;)V",
- QJNIObjectPrivate::fromString(path).object());
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
+ QJniObject::fromString(path).object());
}
void AndroidMediaRecorder::setSurfaceTexture(AndroidSurfaceTexture *texture)
{
- QJNIEnvironmentPrivate env;
m_mediaRecorder.callMethod<void>("setPreviewDisplay",
"(Landroid/view/Surface;)V",
texture->surface());
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
void AndroidMediaRecorder::setSurfaceHolder(AndroidSurfaceHolder *holder)
{
- QJNIEnvironmentPrivate env;
- QJNIObjectPrivate surfaceHolder(holder->surfaceHolder());
- QJNIObjectPrivate surface = surfaceHolder.callObjectMethod("getSurface",
+ QJniObject surfaceHolder(holder->surfaceHolder());
+ QJniObject surface = surfaceHolder.callObjectMethod("getSurface",
"()Landroid/view/Surface;");
if (!surface.isValid())
return;
@@ -375,31 +300,17 @@ void AndroidMediaRecorder::setSurfaceHolder(AndroidSurfaceHolder *holder)
m_mediaRecorder.callMethod<void>("setPreviewDisplay",
"(Landroid/view/Surface;)V",
surface.object());
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif
- env->ExceptionClear();
- }
}
-bool AndroidMediaRecorder::initJNI(JNIEnv *env)
+bool AndroidMediaRecorder::registerNativeMethods()
{
- jclass clazz = QJNIEnvironmentPrivate::findClass(QtMediaRecorderListenerClassName,
- env);
-
- static const JNINativeMethod methods[] = {
+ static JNINativeMethod methods[] = {
{"notifyError", "(JII)V", (void *)notifyError},
{"notifyInfo", "(JII)V", (void *)notifyInfo}
};
- if (clazz && env->RegisterNatives(clazz,
- methods,
- sizeof(methods) / sizeof(methods[0])) != JNI_OK) {
- return false;
- }
-
- return true;
+ const int size = sizeof(methods) / sizeof(methods[0]);
+ return QJniEnvironment().registerNativeMethods(QtMediaRecorderListenerClassName, methods, size);
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h
index 6cab2285a..a9d597869 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h
+++ b/src/multimedia/platform/android/wrappers/jni/androidmediarecorder_p.h
@@ -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.
@@ -52,7 +52,7 @@
//
#include <qobject.h>
-#include <QtCore/private/qjni_p.h>
+#include <QtCore/qjniobject.h>
#include <qsize.h>
QT_BEGIN_NAMESPACE
@@ -95,8 +95,8 @@ public:
int getValue(Field field) const;
private:
- AndroidCamcorderProfile(const QJNIObjectPrivate &camcorderProfile);
- QJNIObjectPrivate m_camcorderProfile;
+ AndroidCamcorderProfile(const QJniObject &camcorderProfile);
+ QJniObject m_camcorderProfile;
};
class AndroidMediaRecorder : public QObject
@@ -177,7 +177,7 @@ public:
void setSurfaceTexture(AndroidSurfaceTexture *texture);
void setSurfaceHolder(AndroidSurfaceHolder *holder);
- static bool initJNI(JNIEnv *env);
+ static bool registerNativeMethods();
Q_SIGNALS:
void error(int what, int extra);
@@ -185,7 +185,7 @@ Q_SIGNALS:
private:
jlong m_id;
- QJNIObjectPrivate m_mediaRecorder;
+ QJniObject m_mediaRecorder;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmultimediautils.cpp b/src/multimedia/platform/android/wrappers/jni/androidmultimediautils.cpp
index 387cb1721..1fe482f30 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidmultimediautils.cpp
+++ b/src/multimedia/platform/android/wrappers/jni/androidmultimediautils.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,40 +39,41 @@
#include "androidmultimediautils_p.h"
-#include <QtCore/private/qjni_p.h>
+#include <QtCore/qjniobject.h>
QT_BEGIN_NAMESPACE
void AndroidMultimediaUtils::enableOrientationListener(bool enable)
{
- QJNIObjectPrivate::callStaticMethod<void>("org/qtproject/qt/android/multimedia/QtMultimediaUtils",
- "enableOrientationListener",
- "(Z)V",
- enable);
+ QJniObject::callStaticMethod<void>("org/qtproject/qt/android/multimedia/QtMultimediaUtils",
+ "enableOrientationListener",
+ "(Z)V",
+ enable);
}
int AndroidMultimediaUtils::getDeviceOrientation()
{
- return QJNIObjectPrivate::callStaticMethod<jint>("org/qtproject/qt/android/multimedia/QtMultimediaUtils",
- "getDeviceOrientation");
+ return QJniObject::callStaticMethod<jint>("org/qtproject/qt/android/multimedia/QtMultimediaUtils",
+ "getDeviceOrientation");
}
QString AndroidMultimediaUtils::getDefaultMediaDirectory(MediaType type)
{
- QJNIObjectPrivate path = QJNIObjectPrivate::callStaticObjectMethod("org/qtproject/qt/android/multimedia/QtMultimediaUtils",
- "getDefaultMediaDirectory",
- "(I)Ljava/lang/String;",
- jint(type));
+ QJniObject path = QJniObject::callStaticObjectMethod(
+ "org/qtproject/qt/android/multimedia/QtMultimediaUtils",
+ "getDefaultMediaDirectory",
+ "(I)Ljava/lang/String;",
+ jint(type));
return path.toString();
}
void AndroidMultimediaUtils::registerMediaFile(const QString &file)
{
- QJNIObjectPrivate::callStaticMethod<void>("org/qtproject/qt/android/multimedia/QtMultimediaUtils",
- "registerMediaFile",
- "(Ljava/lang/String;)V",
- QJNIObjectPrivate::fromString(file).object());
+ QJniObject::callStaticMethod<void>("org/qtproject/qt/android/multimedia/QtMultimediaUtils",
+ "registerMediaFile",
+ "(Ljava/lang/String;)V",
+ QJniObject::fromString(file).object());
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidmultimediautils_p.h b/src/multimedia/platform/android/wrappers/jni/androidmultimediautils_p.h
index cb80c5c1e..8a1fd7328 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidmultimediautils_p.h
+++ b/src/multimedia/platform/android/wrappers/jni/androidmultimediautils_p.h
@@ -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.
@@ -52,7 +52,6 @@
//
#include <qobject.h>
-#include <QtCore/private/qjni_p.h>
QT_BEGIN_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidsurfacetexture.cpp b/src/multimedia/platform/android/wrappers/jni/androidsurfacetexture.cpp
index 8f9be7c3b..3e96c15b5 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidsurfacetexture.cpp
+++ b/src/multimedia/platform/android/wrappers/jni/androidsurfacetexture.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.
@@ -38,9 +38,8 @@
****************************************************************************/
#include "androidsurfacetexture_p.h"
-#include <QtCore/private/qjni_p.h>
-#include <QtCore/private/qjnihelpers_p.h>
#include <QtCore/qmutex.h>
+#include <QtCore/qcoreapplication.h>
QT_BEGIN_NAMESPACE
@@ -67,32 +66,25 @@ AndroidSurfaceTexture::AndroidSurfaceTexture(quint32 texName)
{
Q_STATIC_ASSERT(sizeof (jlong) >= sizeof (void *));
// API level 11 or higher is required
- if (QtAndroidPrivate::androidSdkVersion() < 11) {
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 11) {
qWarning("Camera preview and video playback require Android 3.0 (API level 11) or later.");
return;
}
- QJNIEnvironmentPrivate env;
- m_surfaceTexture = QJNIObjectPrivate("android/graphics/SurfaceTexture", "(I)V", jint(texName));
- if (env->ExceptionCheck()) {
-#ifdef QT_DEBUG
- env->ExceptionDescribe();
-#endif // QT_DEBUG
- env->ExceptionClear();
- }
+ m_surfaceTexture = QJniObject("android/graphics/SurfaceTexture", "(I)V", jint(texName));
if (!m_surfaceTexture.isValid())
return;
const QMutexLocker lock(g_textureMutex());
g_surfaceTextures->append(jlong(this));
- QJNIObjectPrivate listener(QtSurfaceTextureListenerClassName, "(J)V", jlong(this));
+ QJniObject listener(QtSurfaceTextureListenerClassName, "(J)V", jlong(this));
setOnFrameAvailableListener(listener);
}
AndroidSurfaceTexture::~AndroidSurfaceTexture()
{
- if (QtAndroidPrivate::androidSdkVersion() > 13 && m_surface.isValid())
+ if (QNativeInterface::QAndroidApplication::sdkVersion() > 13 && m_surface.isValid())
m_surface.callMethod<void>("release");
if (m_surfaceTexture.isValid()) {
@@ -110,8 +102,7 @@ QMatrix4x4 AndroidSurfaceTexture::getTransformMatrix()
if (!m_surfaceTexture.isValid())
return matrix;
- QJNIEnvironmentPrivate env;
-
+ QJniEnvironment env;
jfloatArray array = env->NewFloatArray(16);
m_surfaceTexture.callMethod<void>("getTransformMatrix", "([F)V", array);
env->GetFloatArrayRegion(array, 0, 16, matrix.data());
@@ -122,7 +113,7 @@ QMatrix4x4 AndroidSurfaceTexture::getTransformMatrix()
void AndroidSurfaceTexture::release()
{
- if (QtAndroidPrivate::androidSdkVersion() < 14)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 14)
return;
m_surfaceTexture.callMethod<void>("release");
@@ -144,9 +135,9 @@ jobject AndroidSurfaceTexture::surfaceTexture()
jobject AndroidSurfaceTexture::surface()
{
if (!m_surface.isValid()) {
- m_surface = QJNIObjectPrivate("android/view/Surface",
- "(Landroid/graphics/SurfaceTexture;)V",
- m_surfaceTexture.object());
+ m_surface = QJniObject("android/view/Surface",
+ "(Landroid/graphics/SurfaceTexture;)V",
+ m_surfaceTexture.object());
}
return m_surface.object();
@@ -155,9 +146,9 @@ jobject AndroidSurfaceTexture::surface()
jobject AndroidSurfaceTexture::surfaceHolder()
{
if (!m_surfaceHolder.isValid()) {
- m_surfaceHolder = QJNIObjectPrivate("org/qtproject/qt/android/multimedia/QtSurfaceTextureHolder",
- "(Landroid/view/Surface;)V",
- surface());
+ m_surfaceHolder = QJniObject("org/qtproject/qt/android/multimedia/QtSurfaceTextureHolder",
+ "(Landroid/view/Surface;)V",
+ surface());
}
return m_surfaceHolder.object();
@@ -165,7 +156,7 @@ jobject AndroidSurfaceTexture::surfaceHolder()
void AndroidSurfaceTexture::attachToGLContext(quint32 texName)
{
- if (QtAndroidPrivate::androidSdkVersion() < 16 || !m_surfaceTexture.isValid())
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 16 || !m_surfaceTexture.isValid())
return;
m_surfaceTexture.callMethod<void>("attachToGLContext", "(I)V", texName);
@@ -173,35 +164,29 @@ void AndroidSurfaceTexture::attachToGLContext(quint32 texName)
void AndroidSurfaceTexture::detachFromGLContext()
{
- if (QtAndroidPrivate::androidSdkVersion() < 16 || !m_surfaceTexture.isValid())
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 16 || !m_surfaceTexture.isValid())
return;
m_surfaceTexture.callMethod<void>("detachFromGLContext");
}
-bool AndroidSurfaceTexture::initJNI(JNIEnv *env)
+bool AndroidSurfaceTexture::registerNativeMethods()
{
// SurfaceTexture is available since API 11.
- if (QtAndroidPrivate::androidSdkVersion() < 11)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() < 11)
return false;
- jclass clazz = QJNIEnvironmentPrivate::findClass(QtSurfaceTextureListenerClassName,
- env);
-
- static const JNINativeMethod methods[] = {
+ static JNINativeMethod methods[] = {
{"notifyFrameAvailable", "(J)V", (void *)notifyFrameAvailable}
};
-
- if (clazz && env->RegisterNatives(clazz,
- methods,
- sizeof(methods) / sizeof(methods[0])) != JNI_OK) {
+ const int size = sizeof(methods) / sizeof(methods[0]);
+ if (QJniEnvironment().registerNativeMethods(QtSurfaceTextureListenerClassName, methods, size))
return false;
- }
return true;
}
-void AndroidSurfaceTexture::setOnFrameAvailableListener(const QJNIObjectPrivate &listener)
+void AndroidSurfaceTexture::setOnFrameAvailableListener(const QJniObject &listener)
{
m_surfaceTexture.callMethod<void>("setOnFrameAvailableListener",
"(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V",
diff --git a/src/multimedia/platform/android/wrappers/jni/androidsurfacetexture_p.h b/src/multimedia/platform/android/wrappers/jni/androidsurfacetexture_p.h
index 5404bb7a7..d31df972b 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidsurfacetexture_p.h
+++ b/src/multimedia/platform/android/wrappers/jni/androidsurfacetexture_p.h
@@ -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.
@@ -52,7 +52,7 @@
//
#include <qobject.h>
-#include <QtCore/private/qjni_p.h>
+#include <QtCore/qjniobject.h>
#include <QMatrix4x4>
@@ -77,17 +77,17 @@ public:
void attachToGLContext(quint32 texName); // API level 16
void detachFromGLContext(); // API level 16
- static bool initJNI(JNIEnv *env);
+ static bool registerNativeMethods();
Q_SIGNALS:
void frameAvailable();
private:
- void setOnFrameAvailableListener(const QJNIObjectPrivate &listener);
+ void setOnFrameAvailableListener(const QJniObject &listener);
- QJNIObjectPrivate m_surfaceTexture;
- QJNIObjectPrivate m_surface;
- QJNIObjectPrivate m_surfaceHolder;
+ QJniObject m_surfaceTexture;
+ QJniObject m_surface;
+ QJniObject m_surfaceHolder;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp b/src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp
index cbe17a6f9..80527373b 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidsurfaceview.cpp
+++ b/src/multimedia/platform/android/wrappers/jni/androidsurfaceview.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.
@@ -53,7 +53,7 @@ typedef QList<AndroidSurfaceHolder *> SurfaceHolders;
Q_GLOBAL_STATIC(SurfaceHolders, surfaceHolders)
Q_GLOBAL_STATIC(QMutex, shLock)
-AndroidSurfaceHolder::AndroidSurfaceHolder(QJNIObjectPrivate object)
+AndroidSurfaceHolder::AndroidSurfaceHolder(QJniObject object)
: m_surfaceHolder(object)
, m_surfaceCreated(false)
{
@@ -65,7 +65,7 @@ AndroidSurfaceHolder::AndroidSurfaceHolder(QJNIObjectPrivate object)
surfaceHolders->append(this);
}
- QJNIObjectPrivate callback(QtSurfaceHolderCallbackClassName, "(J)V", reinterpret_cast<jlong>(this));
+ QJniObject callback(QtSurfaceHolderCallbackClassName, "(J)V", reinterpret_cast<jlong>(this));
m_surfaceHolder.callMethod<void>("addCallback",
"(Landroid/view/SurfaceHolder$Callback;)V",
callback.object());
@@ -113,23 +113,15 @@ void AndroidSurfaceHolder::handleSurfaceDestroyed(JNIEnv*, jobject, jlong id)
(*surfaceHolders)[i]->m_surfaceCreated = false;
}
-bool AndroidSurfaceHolder::initJNI(JNIEnv *env)
+bool AndroidSurfaceHolder::registerNativeMethods()
{
- jclass clazz = QJNIEnvironmentPrivate::findClass(QtSurfaceHolderCallbackClassName,
- env);
-
- static const JNINativeMethod methods[] = {
+ static JNINativeMethod methods[] = {
{"notifySurfaceCreated", "(J)V", (void *)AndroidSurfaceHolder::handleSurfaceCreated},
{"notifySurfaceDestroyed", "(J)V", (void *)AndroidSurfaceHolder::handleSurfaceDestroyed}
};
- if (clazz && env->RegisterNatives(clazz,
- methods,
- sizeof(methods) / sizeof(methods[0])) != JNI_OK) {
- return false;
- }
-
- return true;
+ const int size = sizeof(methods) / sizeof(methods[0]);
+ return QJniEnvironment().registerNativeMethods(QtSurfaceHolderCallbackClassName, methods, size);
}
AndroidSurfaceView::AndroidSurfaceView()
@@ -138,17 +130,17 @@ AndroidSurfaceView::AndroidSurfaceView()
, m_pendingVisible(-1)
{
QtAndroidPrivate::runOnAndroidThreadSync([this] {
- m_surfaceView = QJNIObjectPrivate("android/view/SurfaceView",
+ m_surfaceView = QJniObject("android/view/SurfaceView",
"(Landroid/content/Context;)V",
- QtAndroidPrivate::activity());
- }, QJNIEnvironmentPrivate());
+ QNativeInterface::QAndroidApplication::context());
+ }, QJniEnvironment().jniEnv());
Q_ASSERT(m_surfaceView.isValid());
- QJNIObjectPrivate holder = m_surfaceView.callObjectMethod("getHolder",
- "()Landroid/view/SurfaceHolder;");
+ QJniObject holder = m_surfaceView.callObjectMethod("getHolder",
+ "()Landroid/view/SurfaceHolder;");
if (!holder.isValid()) {
- m_surfaceView = QJNIObjectPrivate();
+ m_surfaceView = QJniObject();
} else {
m_surfaceHolder = new AndroidSurfaceHolder(holder);
connect(m_surfaceHolder, &AndroidSurfaceHolder::surfaceCreated,
diff --git a/src/multimedia/platform/android/wrappers/jni/androidsurfaceview_p.h b/src/multimedia/platform/android/wrappers/jni/androidsurfaceview_p.h
index 7d89df09b..cd0badc34 100644
--- a/src/multimedia/platform/android/wrappers/jni/androidsurfaceview_p.h
+++ b/src/multimedia/platform/android/wrappers/jni/androidsurfaceview_p.h
@@ -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.
@@ -51,7 +51,7 @@
// We mean it.
//
-#include <QtCore/private/qjni_p.h>
+#include <QtCore/qjniobject.h>
#include <qrect.h>
#include <QtCore/qrunnable.h>
@@ -68,18 +68,18 @@ public:
jobject surfaceHolder() const;
bool isSurfaceCreated() const;
- static bool initJNI(JNIEnv *env);
+ static bool registerNativeMethods();
Q_SIGNALS:
void surfaceCreated();
private:
- AndroidSurfaceHolder(QJNIObjectPrivate object);
+ AndroidSurfaceHolder(QJniObject object);
static void handleSurfaceCreated(JNIEnv*, jobject, jlong id);
static void handleSurfaceDestroyed(JNIEnv*, jobject, jlong id);
- QJNIObjectPrivate m_surfaceHolder;
+ QJniObject m_surfaceHolder;
bool m_surfaceCreated;
friend class AndroidSurfaceView;
@@ -101,7 +101,7 @@ Q_SIGNALS:
void surfaceCreated();
private:
- QJNIObjectPrivate m_surfaceView;
+ QJniObject m_surfaceView;
QWindow *m_window;
AndroidSurfaceHolder *m_surfaceHolder;
int m_pendingVisible;