使用NDKr19c编译Android平台可用的openssl库:libcrypto.so和libssl.so(QT在Android上使用OpenSSL)

一、环境介绍

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

使用NDKr19c编译Android平台可用的openssl库:libcrypto.so和libssl.so(QT在Android上使用OpenSSL)_第1张图片

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

编译成功: 

使用NDKr19c编译Android平台可用的openssl库:libcrypto.so和libssl.so(QT在Android上使用OpenSSL)_第2张图片

使用NDKr19c编译Android平台可用的openssl库:libcrypto.so和libssl.so(QT在Android上使用OpenSSL)_第3张图片

 

将编译库打包到Android目录下:

使用NDKr19c编译Android平台可用的openssl库:libcrypto.so和libssl.so(QT在Android上使用OpenSSL)_第4张图片

到这里有个问题,发现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

 

 

使用NDKr19c编译Android平台可用的openssl库:libcrypto.so和libssl.so(QT在Android上使用OpenSSL)_第5张图片

 

 

 

下面公众号里有全套的QT\C++\C、单片机基础教程:

使用NDKr19c编译Android平台可用的openssl库:libcrypto.so和libssl.so(QT在Android上使用OpenSSL)_第6张图片

你可能感兴趣的:(QT)