Android NDK 编译 openssl 动态库

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组件时就不会出现问题了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quard_D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值