From 4f06215965486fd206cf379b685e57f1b786d5a4 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Thu, 9 Jul 2026 23:16:19 +0100 Subject: [PATCH] Get Qt6 build working on Android. --- CMakeLists.txt | 84 +++++++++++++++++++++++++++++++- plugins/channeltx/CMakeLists.txt | 2 +- sdrbase/util/android.cpp | 16 +++--- 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 335cbc73b..9835bad21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -540,6 +540,10 @@ elseif(ANDROID) set(CSPICE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/cspice/include" CACHE INTERNAL "") set(CSPICE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/cspice/lib/libcspice.a" CACHE INTERNAL "") + set(INMARSATC_FOUND ON CACHE INTERNAL "") + set(INMARSATC_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/inmarsatc/include" CACHE INTERNAL "") + set(INMARSATC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/inmarsatc/lib/libinmarsatc_decoder.so" "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/inmarsatc/lib/libinmarsatc_parser.so" CACHE INTERNAL "") + set(ZLIB_FOUND ON CACHE INTERNAL "") set(ZLIB_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/zlib/include" CACHE INTERNAL "") set(ZLIB_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/zlib/lib/libz.a" CACHE INTERNAL "") @@ -579,6 +583,10 @@ elseif(ANDROID) set(GGMORSE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ggmorse/include/" CACHE INTERNAL "") set(GGMORSE_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ggmorse/lib/static/libggmorse.a" CACHE INTERNAL "") + set(CM256CC_FOUND ON CACHE INTERNAL "") + set(CM256CC_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/cm256cc/include/" CACHE INTERNAL "") + set(CM256CC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/cm256cc/lib/libcm256cc.so" CACHE INTERNAL "") + set(FLAC_FOUND ON CACHE INTERNAL "") set(FLAC_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/include/" CACHE INTERNAL "") set(FLAC_LIBRARIES "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/lib/libFLAC.so" CACHE INTERNAL "") @@ -603,10 +611,53 @@ elseif(ANDROID) set(LIMESUITE_INCLUDE_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/limesuite/include/" CACHE INTERNAL "") set(LIMESUITE_LIBRARY "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/limesuite/lib/libLimeSuite.a" CACHE INTERNAL "") + set(OpenCV_FOUND ON CACHE INTERNAL "") + set(OpenCV_INCLUDE_DIRS "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/opencv/sdk/native/jni/include/" CACHE INTERNAL "") + set(OpenCV_LIBS_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/opencv/sdk/native/staticlibs/${ANDROID_ABI}") + set(OpenCV_LIBS + "${OpenCV_LIBS_DIR}/libopencv_bgsegm.a" + "${OpenCV_LIBS_DIR}/libopencv_calib3d.a" + "${OpenCV_LIBS_DIR}/libopencv_core.a" + "${OpenCV_LIBS_DIR}/libopencv_dnn.a" + "${OpenCV_LIBS_DIR}/libopencv_features2d.a" + "${OpenCV_LIBS_DIR}/libopencv_flann.a" + "${OpenCV_LIBS_DIR}/libopencv_highgui.a" + "${OpenCV_LIBS_DIR}/libopencv_imgcodecs.a" + "${OpenCV_LIBS_DIR}/libopencv_imgproc.a" + "${OpenCV_LIBS_DIR}/libopencv_photo.a" + "${OpenCV_LIBS_DIR}/libopencv_video.a" + "${OpenCV_LIBS_DIR}/libopencv_videoio.a" + "${OpenCV_LIBS_DIR}/libopencv_ximgproc.a" + CACHE INTERNAL "") + set(OpenCV_3RDPARTY_LIBS_DIR "${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/opencv/sdk/native/3rdparty/libs/${ANDROID_ABI}") + set(OpenCV_3RDPARTY_LIBS + "${OpenCV_3RDPARTY_LIBS_DIR}/libtegra_hal.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/libkleidicv_hal.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/libkleidicv_thread.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/libkleidicv.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/liblibtiff.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/liblibjpeg-turbo.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/liblibpng.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/liblibwebp.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/liblibopenjp2.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/libIlmImf.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/libittnotify.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/libcpufeatures.a" + "${OpenCV_3RDPARTY_LIBS_DIR}/liblibprotobuf.a" + ) + list(APPEND OpenCV_LIBS ${OpenCV_3RDPARTY_LIBS} ${ZLIB_LIBRARIES}) + find_library(ANDROID_MEDIANDK_LIBRARY mediandk) + if(ANDROID_MEDIANDK_LIBRARY) + list(APPEND OpenCV_LIBS "${ANDROID_MEDIANDK_LIBRARY}") + else() + list(APPEND OpenCV_LIBS mediandk) + endif() + set(OpenCV_LIBS "${OpenCV_LIBS}" CACHE INTERNAL "") + if (ENABLE_QT6) set(ANDROID_EXTRA_LIBS - ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libssl_1_1.so - ${EXTERNAL_LIBRARY_FOLDER}/android_openssl/latest/arm64/libcrypto_1_1.so + ${EXTERNAL_LIBRARY_FOLDER}/android_openssl-master/ssl_3/${ANDROID_ABI}/libssl_3.so + ${EXTERNAL_LIBRARY_FOLDER}/android_openssl-master/ssl_3/${ANDROID_ABI}/libcrypto_3.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavcodec.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavdevice.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/ffmpeg/lib/libavfilter.so @@ -619,7 +670,34 @@ elseif(ANDROID) ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/dsdcc/lib/libdsdcc.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libunrooted_android.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/libusb/lib/libusb1.0.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/cm256cc/lib/libcm256cc.so ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/flac/lib/libFLAC.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/inmarsatc/lib/libinmarsatc_decoder.so + ${EXTERNAL_LIBRARY_FOLDER}/${ANDROID_ABI}/inmarsatc/lib/libinmarsatc_parser.so + ${Qt6_DIR}/../../../lib/libQt6Sql_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6SerialPort_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6Charts_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6Positioning_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6PositioningQuick_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6Location_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6Concurrent_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6MultimediaWidgets_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6TextToSpeech_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6QuickWidgets_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6QuickControls2_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6QuickWidgets_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6QuickTemplates2_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6QuickShapes_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../lib/libQt6SvgWidgets_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../plugins/sqldrivers/libplugins_sqldrivers_qsqlite_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../plugins/geoservices/libplugins_geoservices_qtgeoservices_osm_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../plugins/tls/libplugins_tls_qopensslbackend_${ANDROID_ABI}.so + ${Qt6_DIR}/../../../plugins/tls/libplugins_tls_qcertonlybackend_${ANDROID_ABI}.so + ${CMAKE_BINARY_DIR}/lib/libft8.so + ${CMAKE_BINARY_DIR}/lib/libmetisdevice.so + ${CMAKE_BINARY_DIR}/lib/libmodemm17.so + ${CMAKE_BINARY_DIR}/lib/libmodemmeshtastic.so + ${CMAKE_BINARY_DIR}/lib/libwdsp.so CACHE INTERNAL "" ) else() @@ -902,7 +980,9 @@ elseif(ENABLE_EXTERNAL_LIBRARIES STREQUAL "AUTO") endif() if (NOT ENABLE_EXTERNAL_LIBRARIES OR (ENABLE_EXTERNAL_LIBRARIES STREQUAL "AUTO")) + if (NOT OpenCV_FOUND) find_package(OpenCV OPTIONAL_COMPONENTS core highgui imgproc imgcodecs videoio) # channeltx/modatv + endif() find_package(LibSigMF) # SigMF recording files support find_package(ZLIB) # For DAB find_package(FAAD) # For DAB diff --git a/plugins/channeltx/CMakeLists.txt b/plugins/channeltx/CMakeLists.txt index 7dee0b007..db6b79163 100644 --- a/plugins/channeltx/CMakeLists.txt +++ b/plugins/channeltx/CMakeLists.txt @@ -78,7 +78,7 @@ find_package(FFmpeg COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE) if (ENABLE_CHANNELTX_MODDATV AND FFMPEG_FOUND AND OpenCV_FOUND) add_subdirectory(moddatv) else() - message(STATUS "Not building moddatv (ENABLE_CHANNELTX_MODDATV=${ENABLE_CHANNELTX_MODDATV} FFMPEG_FOUND=${FFMPEG_FOUND})") + message(STATUS "Not building moddatv (ENABLE_CHANNELTX_MODDATV=${ENABLE_CHANNELTX_MODDATV} FFMPEG_FOUND=${FFMPEG_FOUND} OpenCV_FOUND=${OpenCV_FOUND})") endif() if (ENABLE_CHANNELTX_MODFREEDV AND CODEC2_FOUND) diff --git a/sdrbase/util/android.cpp b/sdrbase/util/android.cpp index 3e72ca855..c032a76be 100644 --- a/sdrbase/util/android.cpp +++ b/sdrbase/util/android.cpp @@ -45,7 +45,7 @@ QStringList Android::listUSBDeviceSerials(int vid, int pid) QStringList serials; QJniEnvironment jniEnv; - QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); + QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { QJniObject serialsObj = activity.callObjectMethod("listUSBDeviceSerials", "(II)[Ljava/lang/String;", vid, pid); @@ -64,7 +64,7 @@ QStringList Android::listUSBDeviceSerials(int vid, int pid) int Android::openUSBDevice(const QString &serial) { int fd = -1; - QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); + QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { QJniObject serialsObj = QJniObject::fromString(serial); @@ -78,7 +78,7 @@ void Android::closeUSBDevice(int fd) { if (fd >= 0) { - QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); + QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { activity.callMethod("closeUSBDevice", "(I)V", fd); } else { @@ -89,7 +89,7 @@ void Android::closeUSBDevice(int fd) void Android::moveTaskToBack() { - QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); + QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { activity.callMethod("moveTaskToBack", "(Z)Z", true); } @@ -97,7 +97,7 @@ void Android::moveTaskToBack() void Android::acquireWakeLock() { - QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); + QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { activity.callMethod("acquireWakeLock"); } @@ -105,7 +105,7 @@ void Android::acquireWakeLock() void Android::releaseWakeLock() { - QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); + QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { activity.callMethod("releaseWakeLock"); } @@ -113,7 +113,7 @@ void Android::releaseWakeLock() void Android::acquireScreenLock() { - QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); + QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { activity.callMethod("acquireScreenLock"); } @@ -121,7 +121,7 @@ void Android::acquireScreenLock() void Android::releaseScreenLock() { - QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); + QJniObject activity = QJniObject::callStaticObjectMethod("org/qtproject/qt/android/QtNative", "activity", "()Landroid/app/Activity;"); if (activity.isValid()) { activity.callMethod("releaseScreenLock"); }