diff options
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; |