Skip to content

Commit

Permalink
Compile android version of MythTV against the Qt6 libraries.
Browse files Browse the repository at this point in the history
From https://bugreports.qt.io/browse/QTBUG-84382:

  We're not having Android Extras in Qt 6.0 however, in the subsequent
  releases (6.1, 6.2) we aim to include the fundamental most needed
  features from QtAndroidExtras into QtBase.

From https://doc.qt.io/qt-6/extras-changes-qt6.html:

  The QAndroidJniObject and QAndroidJniEnvironment classes have been
  replaced by QJniObject and QJniEnvironment respectively.

  Many members of the QtAndroid namespace have replacements in the
  QAndroidApplication native interface.

Change a couple of method names.  Qt5 has these method names
with/without an initial capital letter, where Qt6 only has the
lowercase versions.

    CallMethod -> callMethod
    CallObjectMethod -> callObjectMethod
    CallStaticMethodInt -> callStaticMethodInt

These changes compile, package, and run when building against the Qt5
libraries.  They compile when building against Qt6, but packaging is
still a work in progress.
  • Loading branch information
linuxdude42 committed Jun 30, 2023
1 parent 6feb623 commit 238aaa3
Show file tree
Hide file tree
Showing 10 changed files with 99 additions and 4 deletions.
8 changes: 8 additions & 0 deletions mythtv/libs/libmyth/audio/audiooutputaudiotrack.cpp
@@ -1,5 +1,13 @@
#include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QAndroidJniObject>
#include <QAndroidJniEnvironment>
#else
#include <QJniEnvironment>
#include <QJniObject>
#define QAndroidJniEnvironment QJniEnvironment
#define QAndroidJniObject QJniObject
#endif
#include <android/log.h>

#include "libmythbase/mythlogging.h"
Expand Down
20 changes: 16 additions & 4 deletions mythtv/libs/libmyth/audio/audiooutputopensles.cpp
Expand Up @@ -2,7 +2,15 @@

#include <dlfcn.h>

#include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QAndroidJniEnvironment>
#else
#include <QJniEnvironment>
#include <QJniObject>
#define QAndroidJniEnvironment QJniEnvironment
#define QAndroidJniObject QJniObject
#endif

#include "libmythbase/mythlogging.h"
#include "audiooutputopensles.h"
Expand Down Expand Up @@ -62,19 +70,23 @@ int GetNativeOutputSampleRate(void)
return sample_rate;
#else
//AudioManager.getProperty(PROPERTY_OUTPUT_SAMPLE_RATE)
return QAndroidJniObject::CallStaticMethodInt("android/media/AudioTrack", "getNativeOutputSampleRate", "(I)I", 3);
return QAndroidJniObject::callStaticMethodInt("android/media/AudioTrack", "getNativeOutputSampleRate", "(I)I", 3);
#endif
}

#if 0
int GetNativeOutputFramesPerBuffer(void)
{
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QAndroidJniObject activity = QtAndroid::androidActivity();
#else
QJniObject activity = QNativeInterface::QAndroidApplication::context();
#endif
//Context.getSystemService(Context.AUDIO_SERVICE)
QAndroidJniObject audioManager = activity.CallObjectMethod("getSystemService", "", );
jstring sValue = audioManager.CallMethod<jstring>("getProperty", PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
QAndroidJniObject audioManager = activity.callObjectMethod("getSystemService", "", );
jstring sValue = audioManager.callMethod<jstring>("getProperty", PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
// getNativeOutputFramesPerBuffer
return QAndroidJniObject::CallStaticMethodInt("android/media/AudioManager", "getProperty", "(I)I", 3);
return QAndroidJniObject::callStaticMethodInt("android/media/AudioManager", "getProperty", "(I)I", 3);
}
#endif

Expand Down
11 changes: 11 additions & 0 deletions mythtv/libs/libmyth/mythcontext.cpp
Expand Up @@ -17,7 +17,14 @@
#include <QMutex>
#include <QTcpSocket>
#ifdef Q_OS_ANDROID
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QtAndroidExtras>
#else
#include <QJniEnvironment>
#include <QJniObject>
#define QAndroidJniEnvironment QJniEnvironment
#define QAndroidJniObject QJniObject
#endif
#endif

#ifdef _WIN32
Expand Down Expand Up @@ -610,7 +617,11 @@ bool MythContextPrivate::LoadDatabaseSettings(void)
bool exception=false;
QAndroidJniEnvironment env;
QAndroidJniObject myID = QAndroidJniObject::fromString("android_id");
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QAndroidJniObject activity = QtAndroid::androidActivity();
#else
QJniObject activity = QNativeInterface::QAndroidApplication::context();
#endif
ANDROID_EXCEPTION_CHECK;
QAndroidJniObject appctx = activity.callObjectMethod
("getApplicationContext", "()Landroid/content/Context;");
Expand Down
5 changes: 5 additions & 0 deletions mythtv/libs/libmythtv/decoders/avformatdecoder.cpp
Expand Up @@ -29,7 +29,12 @@ extern "C" {
extern "C" {
#include "libavcodec/jni.h"
}
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QtAndroidExtras>
#else
#include <QJniEnvironment>
#define QAndroidJniEnvironment QJniEnvironment
#endif
#endif // Android

// regardless of building with V4L2 or not, enable IVTV VBI data
Expand Down
9 changes: 9 additions & 0 deletions mythtv/libs/libmythtv/decoders/mythmediacodeccontext.cpp
@@ -1,6 +1,15 @@
// Qt
#include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QtAndroidExtras>
#include <QAndroidJniEnvironment>
#else
#include <QCoreApplication>
#include <QJniEnvironment>
#include <QJniObject>
#define QAndroidJniEnvironment QJniEnvironment
#define QAndroidJniObject QJniObject
#endif

// MythTV
#include "libmythbase/mythcorecontext.h"
Expand Down
7 changes: 7 additions & 0 deletions mythtv/libs/libmythtv/opengl/mythmediacodecinterop.h
Expand Up @@ -4,7 +4,14 @@
// Qt
#include <QMutex>
#include <QWaitCondition>
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QtAndroidExtras>
#else
#include <QJniEnvironment>
#include <QJniObject>
#define QAndroidJniEnvironment QJniEnvironment
#define QAndroidJniObject QJniObject
#endif

// MythTV
#include "mythopenglinterop.h"
Expand Down
6 changes: 6 additions & 0 deletions mythtv/libs/libmythui/mythmainwindow.cpp
Expand Up @@ -55,9 +55,11 @@
#include "devices/mythinputdevicehandler.h"


#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#ifdef Q_OS_ANDROID
#include <QtAndroid>
#endif
#endif

static constexpr std::chrono::milliseconds GESTURE_TIMEOUT { 1s };
static constexpr std::chrono::minutes STANDBY_TIMEOUT { 90min };
Expand Down Expand Up @@ -778,7 +780,11 @@ void MythMainWindow::DelayedAction()
Show();

#ifdef Q_OS_ANDROID
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QtAndroid::hideSplashScreen();
#else
QNativeInterface::QAndroidApplication::hideSplashScreen();
#endif
#endif
}

Expand Down
13 changes: 13 additions & 0 deletions mythtv/libs/libmythui/platforms/mythdisplayandroid.cpp
@@ -1,5 +1,14 @@
// Qt
#include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QtAndroidExtras>
#else
#include <QCoreApplication>
#include <QJniEnvironment>
#include <QJniObject>
#define QAndroidJniEnvironment QJniEnvironment
#define QAndroidJniObject QJniObject
#endif

// MythTV
#include "libmythbase/mythlogging.h"
Expand All @@ -20,7 +29,11 @@ MythDisplayAndroid::~MythDisplayAndroid()
void MythDisplayAndroid::UpdateCurrentMode(void)
{
QAndroidJniEnvironment env;
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QAndroidJniObject activity = QtAndroid::androidActivity();
#else
QJniObject activity = QNativeInterface::QAndroidApplication::context();
#endif
QAndroidJniObject windowManager = activity.callObjectMethod("getWindowManager", "()Landroid/view/WindowManager;");
QAndroidJniObject display = windowManager.callObjectMethod("getDefaultDisplay", "()Landroid/view/Display;");
QAndroidJniObject displayMetrics("android/util/DisplayMetrics");
Expand Down
14 changes: 14 additions & 0 deletions mythtv/libs/libmythui/platforms/mythscreensaverandroid.cpp
@@ -1,6 +1,12 @@
#include "libmythbase/mythlogging.h"
#include "platforms/mythscreensaverandroid.h"
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QtAndroidExtras>
#else
#include <QCoreApplication>
#include <QJniObject>
#define QAndroidJniObject QJniObject
#endif

// call in java is :
//
Expand All @@ -25,7 +31,11 @@ MythScreenSaverAndroid::~MythScreenSaverAndroid()

void MythScreenSaverAndroid::Disable()
{
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QAndroidJniObject activity = QtAndroid::androidActivity();
#else
QJniObject activity = QNativeInterface::QAndroidApplication::context();
#endif
LOG(VB_GENERAL, LOG_INFO, LOC + "disable");
if (activity.isValid()) {
LOG(VB_GENERAL, LOG_INFO, LOC + "disable 1");
Expand All @@ -47,7 +57,11 @@ void MythScreenSaverAndroid::Disable()

void MythScreenSaverAndroid::Restore()
{
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
QAndroidJniObject activity = QtAndroid::androidActivity();
#else
QJniObject activity = QNativeInterface::QAndroidApplication::context();
#endif
LOG(VB_GENERAL, LOG_INFO, LOC + "restore");
if (activity.isValid()) {
LOG(VB_GENERAL, LOG_INFO, LOC + "restore 1");
Expand Down
10 changes: 10 additions & 0 deletions mythtv/programs/mythfrontend/mythfrontend.cpp
Expand Up @@ -9,7 +9,13 @@
// Qt
#include <QtGlobal>
#ifdef Q_OS_ANDROID
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <QtAndroidExtras>
#else
#include <QCoreApplication>
#include <QJniObject>
#define QAndroidJniObject QJniObject
#endif
#endif
#include <QApplication>
#include <QDir>
Expand Down Expand Up @@ -1435,7 +1441,11 @@ static int reloadTheme(void)
// reinitializing the main windows causes a segfault
// with android

#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
auto activity = QtAndroid::androidActivity();
#else
QJniObject activity = QNativeInterface::QAndroidApplication::context();
#endif
auto packageManager = activity.callObjectMethod
( "getPackageManager",
"()Landroid/content/pm/PackageManager;" );
Expand Down

0 comments on commit 238aaa3

Please sign in to comment.