解決QT編譯Android程序不支持openssl問題
1. 問題
使用QT編譯Android程序時,由于需要使用HTTPS的請求,打包的apk里需要附帶openssl相關的庫,不然無法使用https請求。
QT官方對openssl支持的說明,以及提供的解決辦法:https://doc.qt.io/qt-5/android-openssl-support.html
Qt 安裝包附帶 OpenSSL 支持,但由于某些國家/地區的法律限制,OpenSSL 庫不是該包的一部分。如果你的應用程序依賴于 OpenSSL,請考慮將 SSL 庫與你的應用程序包 (APK) 一起打包,因為目標設備可能有也可能沒有。
你可以使用QSslSocket::supportsSsl()靜態函數來檢查目標設備上的 SSL 支持。首先包括頭文件:
#include < QSslSocket >
然后使用以下行檢查是否支持 SSL:
qDebug () << "設備支持OpenSSL:" << QSslSocket :: supportsSsl ();
Android7.0更新的說明:
如果您的應用依賴平臺庫,則請參見 NDK 文檔,了解使用公開 API 等效項替換普通私有 API 的典型修復。 您還可以鏈接至平臺庫,而無需實現此應用,如果應用使用的庫是平臺的一部分(例如 libpng),但不屬于 NDK,則更可如此。 此情況下,請確保您的 APK 包含您打算鏈接到的所有 .so 文件。
注意:有些第三方庫可能會鏈接至非公開 API。 如果您的應用使用這些庫,那么當您的應用在下一個官方發布的 Android 版本上運行時可能會出現崩潰現象。
Android7.0開始,應用不應依賴或使用不屬于 NDK的原生庫,因為這些庫可能會發生更改或從一個 Android 版本遷移至另一版本。 例如,從 OpenSSL 切換至 BoringSSL即屬于此類更改。 此外,不同的設備可能提供不同級別的兼容性,因為不屬于 NDK 中的平臺庫沒有兼容性要求。 如果你必須在較舊設備上訪問非 NDK
庫,則請依據 Android API 級別進行加載。
2. 解決辦法
去這里下載QT的openssl工程: https://github.com/KDAB/android_openssl
CSDN上的-: https://download.csdn.net/download/xiaolong1126626497/82644274
下載之后,將壓縮包解壓,放到自己現在的工程目錄下,然后修改現在工程的pro文件,將剛才解壓的工程添加到自己的工程里即可解決。
android: include($$PWD/android_openssl-master/openssl.pri)
openssl.pr里包含的代碼:
!contains(QT.network_private.enabled_features, openssl-linked) { CONFIG(release, debug|release): SSL_PATH = $$PWD else: SSL_PATH = $$PWD/no-asm if (!versionAtLeast(QT_VERSION, 5.12.4)) { contains(ANDROID_TARGET_ARCH, armeabi-v7a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.3/arm/libcrypto.so \ $$SSL_PATH/Qt-5.12.3/arm/libssl.so } contains(ANDROID_TARGET_ARCH, arm64-v8a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.3/arm64/libcrypto.so \ $$SSL_PATH/Qt-5.12.3/arm64/libssl.so } contains(ANDROID_TARGET_ARCH, x86) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.3/x86/libcrypto.so \ $$SSL_PATH/Qt-5.12.3/x86/libssl.so } } else { if (equals(QT_VERSION, 5.12.4) || equals(QT_VERSION, 5.13.0)) { contains(ANDROID_TARGET_ARCH, armeabi-v7a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.4_5.13.0/arm/libcrypto.so \ $$SSL_PATH/Qt-5.12.4_5.13.0/arm/libssl.so } contains(ANDROID_TARGET_ARCH, arm64-v8a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.4_5.13.0/arm64/libcrypto.so \ $$SSL_PATH/Qt-5.12.4_5.13.0/arm64/libssl.so } contains(ANDROID_TARGET_ARCH, x86) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.4_5.13.0/x86/libcrypto.so \ $$SSL_PATH/Qt-5.12.4_5.13.0/x86/libssl.so } contains(ANDROID_TARGET_ARCH, x86_64) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/Qt-5.12.4_5.13.0/x86_64/libcrypto.so \ $$SSL_PATH/Qt-5.12.4_5.13.0/x86_64/libssl.so } } else { versionAtLeast(QT_VERSION, "5.14.0") { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/arm/libcrypto_1_1.so \ $$SSL_PATH/latest/arm/libssl_1_1.so \ $$SSL_PATH/latest/arm64/libcrypto_1_1.so \ $$SSL_PATH/latest/arm64/libssl_1_1.so \ $$SSL_PATH/latest/x86/libcrypto_1_1.so \ $$SSL_PATH/latest/x86/libssl_1_1.so \ $$SSL_PATH/latest/x86_64/libcrypto_1_1.so \ $$SSL_PATH/latest/x86_64/libssl_1_1.so } else { equals(ANDROID_TARGET_ARCH, armeabi-v7a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/arm/libcrypto_1_1.so \ $$SSL_PATH/latest/arm/libssl_1_1.so } equals(ANDROID_TARGET_ARCH, arm64-v8a) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/arm64/libcrypto_1_1.so \ $$SSL_PATH/latest/arm64/libssl_1_1.so } equals(ANDROID_TARGET_ARCH, x86) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/x86/libcrypto_1_1.so \ $$SSL_PATH/latest/x86/libssl_1_1.so } equals(ANDROID_TARGET_ARCH, x86_64) { ANDROID_EXTRA_LIBS += \ $$SSL_PATH/latest/x86_64/libcrypto_1_1.so \ $$SSL_PATH/latest/x86_64/libssl_1_1.so } } } } }
(1)在ubuntu18.04 環境下,編譯Android工程測試通過。
(2)在win10下編譯Android工程測試通過
Android Qt
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。