summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;