1.序
最近在使用Qt for Android完成一个简单的App,其中有使用到QNetworkAccessManager组件,在使用时发现,如果访问https时会出现找不到动态链接库,查询资料发现现在的Android NDK中不存在openssl,这里我们就需要手动编译。在编译的过程中发现,我使用的Qt5.9.3依赖的openssl库版本不能太高,尝试2.0.x版本是不能使用的,最终找到了Qt兼容的版本openssl-1.0.2l
2.编译
编译就直接分享一个脚本,其中有借鉴网上其他的博客,但是版本做了修改,因此部分内容我进行了修改,注意其中NDK路径的配置。
#!/bin/bash
export ANDROID_NDK=/home/xiaoming/ProgramFile/Android/QT/android-ndk-r10e
export OPENSSL=openssl-1.0.2l
if [ ! -f "$OPENSSL.tar.gz" ]; then
wget https://www.openssl.org/source/$OPENSSL.tar.gz
fi
if [ ! -d "$OPENSSL" ]; then
tar zxf $OPENSSL.tar.gz
fi
if [ ! -d "out" ]; then
mkdir "out"
mkdir "out/openssl"
else
rm -rf out
mkdir "out"
mkdir "out/openssl"
fi
_compile() {
SURFIX=$1
TOOL=$2
ARCH_FLAGS=$3
ARCH_LINK=$4
CFGNAME=$5
ARCH=$6
if [ ! -d "out/openssl/${SURFIX}" ]; then
mkdir "out/openssl/${SURFIX}"
fi
if [ ! -d "toolchain_${SURFIX}" ]; then
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --arch=${ARCH} --install-dir=./toolchain_${SURFIX}
fi
export ANDROID_HOME=`pwd`
export TOOLCHAIN=$ANDROID_HOME/toolchain_${SURFIX}
export CROSS_SYSROOT=$TOOLCHAIN/sysroot
export PATH=$TOOLCHAIN/bin:$PATH
export CC=$TOOLCHAIN/bin/${TOOL}-gcc
export CXX=$TOOLCHAIN/bin/${TOOL}-g++
export LINK=${CXX}
export LD=$TOOLCHAIN/bin/${TOOL}-ld
export AR=$TOOLCHAIN/bin/${TOOL}-ar
export RANLIB=$TOOLCHAIN/bin/${TOOL}-ranlib
export STRIP=$TOOLCHAIN/bin/${TOOL}-strip
export ARCH_FLAGS=$ARCH_FLAGS
export ARCH_LINK=$ARCH_LINK
export CFLAGS="${ARCH_FLAGS} -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64"
export CXXFLAGS="${CFLAGS} -frtti -fexceptions"
export LDFLAGS="${ARCH_LINK}"
cd $OPENSSL/
./Configure ${CFGNAME} --prefix=$TOOLCHAIN/sysroot/usr/local --with-zlib-include=$TOOLCHAIN/sysroot/usr/include --with-zlib-lib=$TOOLCHAIN/sysroot/usr/lib zlib no-asm shared no-unit-test
make clean
make -j8
#make install
make install_sw
cd ..
mv openssl-1.0.2l/libssl.a out/openssl/${SURFIX}/
mv openssl-1.0.2l/libcrypto.a out/openssl/${SURFIX}/
cp $TOOLCHAIN/sysroot/usr/local/lib/libcrypto.so.1.0.0 out/openssl/${SURFIX}/libcrypto.so
cp $TOOLCHAIN/sysroot/usr/local/lib/libssl.so.1.0.0 out/openssl/${SURFIX}/libssl.so
rm -rf $TOOLCHAIN
}
# armv7
_compile "armeabi-v7a" "arm-linux-androideabi" "-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16" "-march=armv7-a -Wl,--fix-cortex-a8" "android-armv7" "arm"
# x86
_compile "x86" "i686-linux-android" "-march=i686 -m32 -msse3 -mstackrealign -mfpmath=sse -mtune=intel" "" "android-x86" "x86"
echo "done"
rm -rf $OPENSSL.tar.gz
rm -rf $OPENSSL
3.添加动态库到工程
编译完成后,在out目录内存在armeabi-v7a、x86两个文件夹,其中均包括libssl.a、libcrtypt.a、libssl.so、libcrtypt.so四个文件,我们需要添加动态.so库到qt.pro项目内如下:注意路径配置
contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
ANDROID_EXTRA_LIBS = \
$$PWD/android/lib/armeabi-v7a/libcrypto.so \
$$PWD/android/lib/armeabi-v7a/libssl.so
}
contains(ANDROID_TARGET_ARCH,x86) {
ANDROID_EXTRA_LIBS = \
$$PWD/android/lib/x86/libcrypto.so \
$$PWD/android/lib/x86/libssl.so
}
4.结语
经测试编译的动态库在目前Qt5.x.x版本均可使用,这样在使用QNetworkAccessManager组件时就不会出现问题了。