解决QT编译Android程序不支持openssl问题

网友投稿 844 2022-05-30

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:

解决QT编译Android程序不支持openssl问题

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小时内删除侵权内容。

上一篇:如何在SAP UI5应用里添加使用摄像头拍照的功能
下一篇:在Spring Security框架下JWT的实现细节原理
相关文章