一、环境介绍
QT版本: 5.12.6
NDK版本: r19c
二、遇到的问题
将QT编译到Android平台运行,用到了QNetworkAccessManager,在Android上运行时报错: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization faile
三、输出当前QT版本openssl支持情况
输出当前QT支持的openSSL版本
qDebug()<<"QSslSocket="<
判断系统是否支持OpenSSL
如果此平台支持SSL,则返回true; 否则,返回false。 如果平台不支持SSL,则套接字将在连接阶段失败。不支持就需要看下面的解决方法。
qDebug() << "OpenSSL支持情况:" << QSslSocket::supportsSsl();
在Android上运行时输出结果:
libcar_project.so: QSslSocket= "OpenSSL 1.1.1b 26 Feb 2019"
libcar_project.so: OpenSSL支持情况: false
四、下载openssl
openssl下载地址:https://github.com/openssl/openssl/releases
NDK下载参考:https://blog.csdn.net/xiaolong1126626497/article/details/104730720
五、使用NDK编译openssl
NDK编译OpenSSL的官方参考文档: https://wiki.openssl.org/index.php/Android
编译步骤:
wbyq@wbyq:~/work/rk3399$ tar xvf /mnt/hgfs/linux-share-dir/openssl-OpenSSL_1_1_1b.tar.gz
wbyq@wbyq:~/work/rk3399$ cd openssl-OpenSSL_1_1_1b/
wbyq@wbyq:~/work/rk3399/openssl-OpenSSL_1_1_1b$ touch setenv-android_64.sh
wbyq@wbyq:~/work/rk3399/openssl-OpenSSL_1_1_1b$ chmod 777 setenv-android_64.sh
setenv-android_64.sh 文件代码如下: (编译ARM64可用库)
脚本里的路径要根据自己情况修改。
#!/bin/bash
set -e
set -x
# Set directory
SCRIPTPATH=/home/wbyq/work/rk3399/openssl-OpenSSL_1_1_1b/
export ANDROID_NDK_HOME=/home/wbyq/work_pc/AndroidPath/android-ndk-r19c
OPENSSL_DIR=/home/wbyq/work/rk3399/openssl-OpenSSL_1_1_1b
# Find the toolchain for your build machine
toolchains_path=/home/wbyq/work_pc/AndroidPath/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/
# Configure the OpenSSL environment, refer to NOTES.ANDROID in OPENSSL_DIR
# Set compiler clang, instead of gcc by default
CC=clang
# Add toolchains bin directory to PATH
PATH=$toolchains_path/bin:$PATH
# Set the Android API levels
ANDROID_API=21
# Set the target architecture
# Can be android-arm, android-arm64, android-x86, android-x86 etc
architecture=android-arm64
# Create the make file
cd ${OPENSSL_DIR}
./Configure ${architecture} -D__ANDROID_API__=$ANDROID_API
# Build
make
# Copy the outputs
OUTPUT_INCLUDE=$SCRIPTPATH/output/include
OUTPUT_LIB=$SCRIPTPATH/output/lib/${architecture}
mkdir -p $OUTPUT_INCLUDE
mkdir -p $OUTPUT_LIB
cp -RL include/openssl $OUTPUT_INCLUDE
cp libcrypto.so $OUTPUT_LIB
cp libcrypto.a $OUTPUT_LIB
cp libssl.so $OUTPUT_LIB
cp libssl.a $OUTPUT_LIB
编译成功:
将编译库打包到Android目录下:
到这里有个问题,发现ANDROID_EXTRA_LIBS 只能打包.so结尾的文件,xx.so.x.x 的格式打包不了。
而QT运行时需要,libcrypto.so.1.1 这个文件。
这里暂时的解决方法是:
先编译部署程序到开发板,找到APP的包路径,将 libcrypto.so libcrypto.so.1.1 libssl.so libssl.so.1.1这4个文件使用adb命令拷贝到Android包目录下即可。
拷贝示例: (org.qtproject_car_2.example 是我工程的包名)
adb push libcrypto.so.1.1 /data/app/org.qtproject_car_2.example-PwC9uMIfKQ0zEu5WHYbs9Q==/lib/arm64
adb push libssl.so.1.1 /data/app/org.qtproject_car_2.example-PwC9uMIfKQ0zEu5WHYbs9Q==/lib/arm64
adb push libcrypto.so /data/app/org.qtproject_car_2.example-PwC9uMIfKQ0zEu5WHYbs9Q==/lib/arm64
adb push libssl.so /data/app/org.qtproject_car_2.example-PwC9uMIfKQ0zEu5WHYbs9Q==/lib/arm64
上面这种拷贝方法,可以解决问题,但是如果重新编译安装APK(应用程序),那么刚才拷贝文件也会被删除,每次拷贝很麻烦,为了后面方便,直接把这几个库拷贝到Android的系统库目录下。
示例:
adb push libcrypto.so.1.1 /system/lib64
adb push libssl.so.1.1 /system/lib64
adb push libcrypto.so /system/lib64
adb push libssl.so /system/lib64
只要不重装Android系统,这几个库就一直存在。
RK3399、Android8.1系统获取root权限。
10.6 Android8.1 下使用adb
1. 第一次启动系统,如果需要更改系统文件,需要关闭安全验证 (注:安装apk不需要关闭),关闭安全验证后需要重启
adb root
adb disable-verity
adb reboot
2. 重启后,获得root权限,并重新挂载 /system 开启写入权限
adb root
adb remount
下面公众号里有全套的QT\C++\C、单片机基础教程: