为 Android 编译最新的 OpenSSL

Posted

技术标签:

【中文标题】为 Android 编译最新的 OpenSSL【英文标题】:Compiling the latest OpenSSL for Android 【发布时间】:2012-08-09 09:57:30 【问题描述】:

我正在尝试为 android 的 OpenSSL1.0.1c 的 (.so) 文件生成共享库。我发现他们在 android 脚本中添加了三个用于为 Android 编译的选项。

./Configure android-armv7  (or)
./Configure android-x86    (or)
./Configure android

一旦我为操作系统配置然后尝试编译,它就会抛出错误。 目前我正在使用 x86 windows7 并安装了 Cygwin、Android sdk R20、Android NDK r8

sh-4.1$ make
making all in crypto...
make[1]: Entering directory `/cygdrive/d/SourceCodes/OpenSSL/openssl-1.0.1c/crypto'
gcc -I. -I.. -I../include  -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -march=armv7-a -mandroid -I/include -B/lib -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_MONT -DOP
ENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DGHASH_ASM   -c -o cryptlib.o cryptlib.c
cc1: error: unrecognized command line option "-mandroid"
cryptlib.c:1:0: error: bad value (armv7-a) for -march= switch
<builtin>: recipe for target `cryptlib.o' failed
make[1]: *** [cryptlib.o] Error 1
make[1]: Leaving directory `/cygdrive/d/SourceCodes/OpenSSL/openssl-1.0.1c/crypto'
Makefile:278: recipe for target `build_crypto' failed
make: *** [build_crypto] Error 1
sh-4.1$

如果有人遇到类似问题并得到解决方案,请告诉我。

【问题讨论】:

freelancer-suman.blogspot.in/p/… github.com/aluvalasuman/OpenSSL1.0.1cForAndroid 您可能应该使用项目提供的说明。另请参阅 OpenSSL wiki 中的 OpenSSL and Android。原来是下面的回答,但被一位版主删掉了。 @jww 查看 openssl wiki 上的说明没有多大意义。他们没有足够的信息来实际为 android 构建。 (您会注意到诸如“ARMv7 和 x86 上的 Android 交叉编译环境”之类的内容——太好了,谢谢,Android 支持的其他架构呢?) OpenSSL wiki 在 NDK 端和 OpenSSL 端都已过时。 【参考方案1】:

这并不能解决您的问题,但也许会有所帮助。谷歌小组发布了他们已成功编译适用于 Android 的 OpenSSL 1.0.1 beta2。

https://groups.google.com/forum/?fromgroups#!topic/android-security-discuss/5-_gCAmEo-M

这可能也有帮助,一个为 Android 构建 1.0.0a 的开源项目:

https://github.com/eighthave/openssl-android

【讨论】:

感谢 Cristy,我已经找到了 github 链接并遵循了相同的方法。在此链接中,给出了针对 android github.com/fries/android-external-openssl/blob/master/… 的 Open SSL 编译的步骤【参考方案2】:

我不建议在 OpenSSL 官方网站之外获取任何内容。在处理密码学和安全问题时,您不能冒险。

我看到的唯一问题是您使用的是主机的 gcc,而不是使用 android 的交叉编译器。

这是我在 Ubuntu 14.04LTS 上编译官方 OpenSSL 的方法(适用于 OpenSSL 1.0.1g)

在您的主文件夹中,运行以下命令:

tar xzvf ~/Downloads/openssl-1.0.1g.tar.gz
cd openssl-1.0.1g
export NDK=~/android-ndk-r9d
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=arm-linux-androideabi-4.6 --install-dir=`pwd`/android-toolchain-arm
export TOOLCHAIN_PATH=`pwd`/android-toolchain-arm/bin
export TOOL=arm-linux-androideabi
export NDK_TOOLCHAIN_BASENAME=$TOOLCHAIN_PATH/$TOOL
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=$CXX
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export ARCH_FLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
export ARCH_LINK="-march=armv7-a -Wl,--fix-cortex-a8"
export CPPFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" $ARCH_LINK "

然后运行你的配置脚本:

./Configure android-armv7

然后构建

PATH=$TOOLCHAIN_PATH:$PATH make

您应该看到它使用的是arm-linux-androideabi-gcc 而不是gcc

为旧的 armeabi 构建:

tar xzvf ~/Downloads/openssl-1.0.1g.tar.gz
cd openssl-1.0.1g
export NDK=~/android-ndk-r9d
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=arm-linux-androideabi-4.6 --install-dir=`pwd`/android-toolchain-arm
export TOOLCHAIN_PATH=`pwd`/android-toolchain-arm/bin
export TOOL=arm-linux-androideabi
export NDK_TOOLCHAIN_BASENAME=$TOOLCHAIN_PATH/$TOOL
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=$CXX
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export ARCH_FLAGS="-mthumb"
export ARCH_LINK=
export CPPFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" $ARCH_LINK "
./Configure android
make clean
PATH=$TOOLCHAIN_PATH:$PATH make

为 x86 构建:

tar xzvf ~/Downloads/openssl-1.0.1g.tar.gz
cd openssl-1.0.1g
export NDK=~/android-ndk-r9d
$NDK/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=x86-4.6 --install-dir=`pwd`/android-toolchain-x86
export TOOLCHAIN_PATH=`pwd`/android-toolchain-x86/bin
export TOOL=i686-linux-android
export NDK_TOOLCHAIN_BASENAME=$TOOLCHAIN_PATH/$TOOL
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=$CXX
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export ARCH_FLAGS="-march=i686 -msse3 -mstackrealign -mfpmath=sse"
export ARCH_LINK=
export CPPFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" $ARCH_LINK "
./Configure android-x86
make clean
PATH=$TOOLCHAIN_PATH:$PATH make

【讨论】:

/Users/alex/Downloads/openssl-1.0.1e/android-toolchain-arm/bin/arm-linux-androideabi-ar r ../libcrypto.a cryptlib.o mem.o mem_dbg .o cversion.o ex_data.o cpt_err.o ebcdic.o uid.o o_time.o o_str.o o_dir.o o_fips.o o_init.o fips_ers.o mem_clr.o /Users/alex/Downloads/openssl-1.0.1e /android-toolchain-arm/bin/arm-linux-androideabi-ar: ../libcrypto.a: Malformed archive make[1]: *** [../libcrypto.a] Error 1 make: *** [ build_crypto] 错误 1 我收到“libcrypto.a: Malformed archive”错误,就像之前的评论一样。你确定这有效吗? 如果得到“cp 无法创建常规文件在 openssl 中没有这样的文件或目录”,请关注 ***.com/questions/23343345/… @SteelFedeX : 你做了./Configure android-x86 吗? 聚会迟到了,但像libcrypto.a: Malformed archive 这样的消息通常可以通过make cleanmake 之前解决【参考方案3】:

在 OpenSSL 1.0.1e 中,我需要做的就是:

CC=~/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc ./Configure android-armv7
ANDROID_DEV=~/android-ndk-r9//platforms/android-8/arch-arm/usr make build_libs

【讨论】:

set_key.c:398:17: 错误:不支持的内联汇编:输入类型为“无符号长”,匹配输出类型为“无符号整数”*(k++)=ROTATE(t2,30)&0xffffffffL; ~~~~~~~^~~~~~ ./des_locl.h:170:19: 注意:从宏'ROTATE'扩展 詹姆斯。谢谢你的提示。我用上面的 4 行创建了一个 shell 文件。我唯一需要的是在 CC 和 ANDROID_DEV 前面添加“导出”。刚建1.0.1g。 我得到一个模糊的“libcrypto.a:N 的成员不是 ELF 对象” - 这是因为 configure 正在获取我的 Xcode 工具链,所以我需要导出 AR=.../ arm-linux-androideabi-gcc-ar 并导出 RANLIB=.../arm-linux-androideabi-gcc-ranlib 我必须添加空的 CROSS_COMPILE:CROSS_COMPILE= CC="$ndkdir/bin/arm-linux-androideabi-gcc" ./Configure【参考方案4】:

感谢此处发布的说明以及其他一些补充内容,我制作了一个自动脚本,它编译了最新的适用于 Android 的 OpenSSL 库,支持:armeabi、armeabi-v7a、x86、x86_64 和 arm64-v8a:

#!/bin/bash -e
#@author Aleksandar Gotev (alex.gotev@mobimesh.it)
#Hints and code taken also from http://***.com/questions/11929773/compiling-the-latest-openssl-for-android

if [ "$#" -ne 6 ]
then
    echo "Usage:"
    echo "./openssl-build <ANDROID_NDK_PATH> <OPENSSL_SOURCES_PATH> <ANDROID_TARGET_API> \\"
    echo "                <ANDROID_TARGET_ABI> <GCC_VERSION> <OUTPUT_PATH>"
    echo
    echo "Supported target ABIs: armeabi, armeabi-v7a, x86, x86_64, arm64-v8a"
    echo
    echo "Example using GCC 4.8, NDK 10e, OpenSSL 1.0.2d and Android API 21 for armeabi-v7a."
    echo "./openssl-build /home/user/android-ndk-r10e \\"
    echo "                /home/user/openssl-1.0.2d \\"
    echo "                21 \\"
    echo "                armeabi-v7a \\"
    echo "                4.8 \\"
    echo "                /home/user/output/armeabi-v7a"
    exit 1
fi

NDK_DIR=$1
OPENSSL_BASE_FOLDER=$2
OPENSSL_TARGET_API=$3
OPENSSL_TARGET_ABI=$4
OPENSSL_GCC_VERSION=$5
OPENSSL_OUTPUT_PATH=$6

NDK_MAKE_TOOLCHAIN="$NDK_DIR/build/tools/make-standalone-toolchain.sh"
OPENSSL_TMP_FOLDER="/tmp/openssl"
rm -rf "$OPENSSL_TMP_FOLDER"
mkdir -p "$OPENSSL_TMP_FOLDER"
cp -r $OPENSSL_BASE_FOLDER $OPENSSL_TMP_FOLDER

function build_library 
    mkdir -p $OPENSSL_OUTPUT_PATH
    export PATH=$TOOLCHAIN_PATH:$PATH
    make && make install
    rm -rf $OPENSSL_TMP_FOLDER
    echo "Build completed! Check output libraries in $OPENSSL_OUTPUT_PATH"


if [ "$OPENSSL_TARGET_ABI" == "armeabi-v7a" ]
then
    $NDK_MAKE_TOOLCHAIN --platform=android-$OPENSSL_TARGET_API \
                          --toolchain=arm-linux-androideabi-$OPENSSL_GCC_VERSION \
                          --install-dir="$OPENSSL_TMP_FOLDER/android-toolchain-arm"
    export TOOLCHAIN_PATH="$OPENSSL_TMP_FOLDER/android-toolchain-arm/bin"
    export TOOL=arm-linux-androideabi
    export NDK_TOOLCHAIN_BASENAME=$TOOLCHAIN_PATH/$TOOL
    export CC=$NDK_TOOLCHAIN_BASENAME-gcc
    export CXX=$NDK_TOOLCHAIN_BASENAME-g++
    export LINK=$CXX
    export LD=$NDK_TOOLCHAIN_BASENAME-ld
    export AR=$NDK_TOOLCHAIN_BASENAME-ar
    export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
    export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
    export ARCH_FLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16"
    export ARCH_LINK="-march=armv7-a -Wl,--fix-cortex-a8"
    export CPPFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export CXXFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
    export CFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export LDFLAGS=" $ARCH_LINK "
    cd $OPENSSL_TMP_FOLDER
    ./Configure android-armv7 --openssldir=$OPENSSL_OUTPUT_PATH
    build_library

elif [ "$OPENSSL_TARGET_ABI" == "arm64-v8a" ]
then
    $NDK_MAKE_TOOLCHAIN --platform=android-$OPENSSL_TARGET_API \
                          --toolchain=aarch64-linux-android-4.9 \
                          --install-dir="$OPENSSL_TMP_FOLDER/android-toolchain-arm64"
    export TOOLCHAIN_PATH="$OPENSSL_TMP_FOLDER/android-toolchain-arm64/bin"
    export TOOL=aarch64-linux-android
    export NDK_TOOLCHAIN_BASENAME=$TOOLCHAIN_PATH/$TOOL
    export CC=$NDK_TOOLCHAIN_BASENAME-gcc
    export CXX=$NDK_TOOLCHAIN_BASENAME-g++
    export LINK=$CXX
    export LD=$NDK_TOOLCHAIN_BASENAME-ld
    export AR=$NDK_TOOLCHAIN_BASENAME-ar
    export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
    export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
    export ARCH_FLAGS=
    export ARCH_LINK=
    export CPPFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export CXXFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
    export CFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export LDFLAGS=" $ARCH_LINK "
    cd $OPENSSL_TMP_FOLDER
    ./Configure android --openssldir=$OPENSSL_OUTPUT_PATH
    build_library

elif [ "$OPENSSL_TARGET_ABI" == "armeabi" ]
then
    $NDK_MAKE_TOOLCHAIN --platform=android-$OPENSSL_TARGET_API \
                          --toolchain=arm-linux-androideabi-$OPENSSL_GCC_VERSION \
                          --install-dir="$OPENSSL_TMP_FOLDER/android-toolchain-arm"
    export TOOLCHAIN_PATH="$OPENSSL_TMP_FOLDER/android-toolchain-arm/bin"
    export TOOL=arm-linux-androideabi
    export NDK_TOOLCHAIN_BASENAME=$TOOLCHAIN_PATH/$TOOL
    export CC=$NDK_TOOLCHAIN_BASENAME-gcc
    export CXX=$NDK_TOOLCHAIN_BASENAME-g++
    export LINK=$CXX
    export LD=$NDK_TOOLCHAIN_BASENAME-ld
    export AR=$NDK_TOOLCHAIN_BASENAME-ar
    export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
    export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
    export ARCH_FLAGS="-mthumb"
    export ARCH_LINK=
    export CPPFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export CXXFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
    export CFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export LDFLAGS=" $ARCH_LINK "
    cd $OPENSSL_TMP_FOLDER
    ./Configure android --openssldir=$OPENSSL_OUTPUT_PATH
    build_library

elif [ "$OPENSSL_TARGET_ABI" == "x86" ]
then
    $NDK_MAKE_TOOLCHAIN --platform=android-$OPENSSL_TARGET_API \
                          --toolchain=x86-$OPENSSL_GCC_VERSION \
                          --install-dir="$OPENSSL_TMP_FOLDER/android-toolchain-x86"
    export TOOLCHAIN_PATH="$OPENSSL_TMP_FOLDER/android-toolchain-x86/bin"
    export TOOL=i686-linux-android
    export NDK_TOOLCHAIN_BASENAME=$TOOLCHAIN_PATH/$TOOL
    export CC=$NDK_TOOLCHAIN_BASENAME-gcc
    export CXX=$NDK_TOOLCHAIN_BASENAME-g++
    export LINK=$CXX
    export LD=$NDK_TOOLCHAIN_BASENAME-ld
    export AR=$NDK_TOOLCHAIN_BASENAME-ar
    export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
    export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
    export ARCH_FLAGS="-march=i686 -msse3 -mstackrealign -mfpmath=sse"
    export ARCH_LINK=
    export CPPFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export CXXFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
    export CFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export LDFLAGS=" $ARCH_LINK "
    cd $OPENSSL_TMP_FOLDER
    ./Configure android-x86 --openssldir=$OPENSSL_OUTPUT_PATH
    build_library

elif [ "$OPENSSL_TARGET_ABI" == "x86_64" ]
then
    $NDK_MAKE_TOOLCHAIN --platform=android-$OPENSSL_TARGET_API \
                          --toolchain=x86_64-4.9 \
                          --install-dir="$OPENSSL_TMP_FOLDER/android-toolchain-x86_64"
    export TOOLCHAIN_PATH="$OPENSSL_TMP_FOLDER/android-toolchain-x86_64/bin"
    export TOOL=x86_64-linux-android
    export NDK_TOOLCHAIN_BASENAME=$TOOLCHAIN_PATH/$TOOL
    export CC=$NDK_TOOLCHAIN_BASENAME-gcc
    export CXX=$NDK_TOOLCHAIN_BASENAME-g++
    export LINK=$CXX
    export LD=$NDK_TOOLCHAIN_BASENAME-ld
    export AR=$NDK_TOOLCHAIN_BASENAME-ar
    export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
    export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
    export CPPFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export CXXFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
    export CFLAGS=" $ARCH_FLAGS -fpic -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
    export LDFLAGS=" $ARCH_LINK "
    cd $OPENSSL_TMP_FOLDER
    ./Configure linux-x86_64 --openssldir=$OPENSSL_OUTPUT_PATH
    build_library

else
    echo "Unsupported target ABI: $OPENSSL_TARGET_ABI"
    exit 1
fi

脚本文档:https://github.com/alexbbb/pjsip-android-builder#build-only-openssl

最后版本检查:https://github.com/alexbbb/pjsip-android-builder/blob/master/openssl-build

【讨论】:

恕我直言,您的帖子作为对 OP 的评论会更好。如果您想保留它作为答案,您可以概述您对先前答案的补充。 不幸的是,这个脚本不起作用 - 我在每个 abi 的每个 cd $OPENSSL_TMP_FOLDER 中都收到错误“没有这样的文件或目录”。这是一般的复制/粘贴错误吗?你真正的意思是哪个变量? ./Configure 脚本位于 OPENSSL_HOME 而不是 TMP 中? 这太酷了,我使用了脚本 ./openssl-build 来自您发布的 git 和 openssl-1.0.2g、ndk-r12b、32 位目标 15 和 64 位目标 21。虽然它在 ubuntu 16.04 上失败,但在 OSX 10.11.6 上成功编译了 ABI x86、x86_64、mips、mips64、arm64-v8a、armeabi-v7a 和 armeabi。但是注意最新的 openssl-1.1.0 编译失败。 请注意,所有arch构建的摘录mips64,脚本包含无效参数android-mips64 @ line 215 ./Configure android-mips64 --openssldir=$OPENSSL_OUTPUT_PATH 脚本效果很好。在执行的时候发现了一些问题,都是由于传递了错误的参数造成的。【参考方案5】:

这就是我为 openssl-1.0.2g 做的:

$ rm -rf openssl-1.0.2g/
$ tar xzf openssl-1.0.2g.tar.gz
$ chmod a+x setenv-android.sh
$ . ./setenv-android.sh ---> Note: make sure in the same folder of your openssl-1.0.2g
$ cd openssl-1.0.2g/

$ perl -pi -e 's/install: all install_docs install_sw/install: install_docs install_sw/g' Makefile.org

$ ./config shared no-ssl2 no-ssl3 no-comp no-hw no-engine --openssldir=<Path of your OpenSSL> 

$ make depend
$ make clean
$ make all
before make install, ---Delete the "include" folder (path/of/your/openssl-1.0.2g/include)  or you may move it to another directory for safe keeping. 
$ make install 

确保在 setenv-android.sh 中输入正确的 NDK 路径,否则会出错。

此版本的示例我使用了 Android NDK vr10b (http://dl.google.com/android/ndk/android-ndk32-r10b-darwin-x86.tar.bz2) 并在我的 setenv-android.sh 文件中使用了 ff 路径值:

_ANDROID_NDK="android-ndk-r10b" (Line 12)
_ANDROID_EABI="arm-linux-androideabi-4.8"(Line 16)
_ANDROID_API="android-19"(Line 24)

参考: https://wiki.openssl.org/index.php/Android

注意---> 我创建了一个 github 提交来回答这个问题,请参阅:https://github.com/rjmangubat23/OpenSSL

我将 setenv-android.sh 的不同脚本上传到我的 github 上,因为您需要针对不同架构使用不同类型的脚本:

对于 x86:https://github.com/rjmangubat23/OpenSSL/tree/master/x86

对于 ArmV7:https://github.com/rjmangubat23/OpenSSL/tree/master/ArmV7

在此处下载 Openssl:ftp://ftp.openssl.org/source

在此处下载完整的 Android NDK 文件列表:https://github.com/taka-no-me/android-cmake/blob/master/ndk_links.md

【讨论】:

【参考方案6】:

Windows 7 + Cygwin 下可以使用this script 编译openssl。您只需要更改 ndk 的位置并选择 android api 版本。

我的方式一步一步(Win 7 x64 + Cygwin + ndk r10c)

    将文件setenv-android-mod.shbuild-all-arch.sh 复制到您的openssl 目录。

    修改文件build-all-arch.sh

    cd openssl-1.0.1j#cd openssl-1.0.1j(第 56 行)

    cd ..#cd ..(第 80 行)

    修改文件setend-android-mod.sh

    _ANDROID_NDK="android-ndk-r10c-x64" 更改为您的 ndk 版本(第 18 行) _ANDROID_API="android-19" 更改为您的 api 版本(第 40 行) ANDROID_NDK_ROOT="d:/work/android/android-ndk-r10c-x64" 指定您的目录(第 42 行) ANDROID_TOOLCHAIN="d:/work/android/android-ndk-r10c-x64/toolchains" 指定您的目录(第 43 行) export CROSS_COMPILE="aarch64-linux-android-"export CROSS_COMPILE="$ANDROID_TOOLCHAIN/aarch64-linux-android-"(第 219 行),更改相同的第 225、231、237、243 行 - 只需将 $ANDROID_TOOLCHAIN/ 添加到交叉编译路径。

运行build-all-arch.sh

所有库 (*.so) 将位于 /prebuilt/ 目录中。

附:由于错误的符号链接,我遇到了更多错误,但在执行以下命令后一切都很好export CYGWIN="winsymlinks:native" 请参阅here 了解详细信息。

【讨论】:

【参考方案7】:

这个问题和许多其他类似的问题让我苦恼了一周左右,但我终于破解了它,所以我想我会分享我的解决方案。如果您愿意破解代码,OpenSSL 可以为 21+ 编译并在 Android 4.03 设备上运行。我们使用 libcurl,所以想要保持最新。步骤有点复杂:

首先确保您拥有可构建的 libcurl 版本。我建议作为一个很好的起点https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src

他们保持最新的构建脚本。

首先将“build”中的 android.ini 破解到版本 21

接下来我必须在 jni 项目的某处添加以下存根函数:

// SPECIAL API 21+ functions required for android to build on newer platform targets.

float strtof (const char* str, char** endptr)

    return (float)strtod(str, endptr);


int __isnanf(float x)

    return (x != x);


double atof (const char* s)

    double rez = 0, fact = 1;
    if (*s == '-')
        s++;
        fact = -1;
    ;
    for (int point_seen = 0; *s; s++)
        if (*s == '.')
            point_seen = 1;
            continue;
        ;
        int d = *s - '0';
        if (d >= 0 && d <= 9)
            if (point_seen) fact /= 10.0f;
            rez = rez * 10.0f + (float)d;
        ;
    ;
    return rez * fact;


void srandom(unsigned int seed)

    std::srand(seed);


static unsigned long _next = 1;

void srand(unsigned int seed)

    _next = seed;


long random()

    return rand();


int rand()

    _next = _next * 1103515245 + 12345;
    return (unsigned int)(_next/65536) % 32768;


/* the default is bsd */
__sighandler_t signal(int s, __sighandler_t f)

    return 0;

请注意,信号功能可能会更好,但对我们来说并不重要。这可以阻止 4.03 设备上由于 5+ (https://groups.google.com/forum/#!topic/android-ndk/RjO9WmG9pfE) 中的标头更改而导致的可怕的“找不到符号”错误。

接下来下载你想要构建的 openssl 版本的 tar.gz 并将其解压到某个地方。编辑 crypto/ui/ui_openssl.c 和 crypto/des/read_pwd.c 并确保不使用 tcsetattr 的#defines。我使用了蛮力 #if 0 和 #if 1 - 请注意,这应该可以通过旋转预处理器来实现,但我现在放弃了。如果有人想分享正确的魔法,请这样做!

现在您需要将文件重新 tar 到 tarballs 文件中(确保将其放入根文件夹:

并运行(在我的情况下)

shasum -a 512 curl-7.50.0.tar.gz > ../src/curl/SHA512SUMS

这将允许 cocos2d ./build.sh 运行。比如:

./build.sh -p=android --libs=openssl,curl --arch=armv7 --mode=release

最后 - 这让我在制作通用 .a 文件方面感到困惑,但这不是问题的直接部分,请确保您使用不使用 NEON 指令的版本。 Tegra 2 设备显然有 FPU 但没有 NEON。我认为这可以使用 -mfpu=vfp 作为编译器标志来完成,但我选择只使用 armv5 构建,因为在这方面性能对我来说并不重要(而且我已经有足够令人讨厌的现实世界的惊喜了已经)。

最后,您应该得到一个很好的 .a 文件,它可以在任何地方工作,并且可以用于针对最新最好的 Android 的项目。现在,如果只有来自 OpenSSL 项目的人可以阅读并修复该项目,以便它了解 2 年前发布的 android 内容!

祝你好运!

【讨论】:

【参考方案8】:

如果有人遇到在其中一个本地库中使用易受攻击版本的 OpenSSL (&lt; 1.0.2f/1.0.1r) 的问题,我会添加更多详细信息和说明。

前提条件:需要先配置Android NDK。

    首先,下载OpenSSL兼容版本(&gt; 1.0.2f/1.0.1r)。

    从this link 下载两个脚本。万一有人想知道他们在做什么(你应该 - 它是一个密码库!!!):他们为每个 android ABI 处理器架构(armeabix86mips 等)构建了 OpenSSL 库。 ..)

    用 ndk 版本修改 setenv-android-mod.sh -> 行 18

    用 Android API 版本修改 setenv-android-mod.sh -> 行 40

    修改 build-all-arch.sh -> 行 7 使用 OpenSSL 库的文件夹名称(在我的例子中是 openssl-1.0.1t

    成功构建后,在文件夹dist 中将显示库

要将openSSL 作为预构建的静态库添加到项目中,请创建:

    jni 目录下的openssl 文件夹,其中包含lib/(其中包含支持架构的.a 文件), include/ 有必要的includes(你可以在你下载的openssl版本下找到,注意有些头文件是符号链接)

    jni文件夹内修改Android.mk,添加以下内容:

    include $(CLEAR_VARS) 
    LOCAL_MODULE := libssl
    LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libssl.a
    include $(PREBUILT_STATIC_LIBRARY)
    include $(CLEAR_VARS)
    LOCAL_MODULE := libcrypto
    LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libcrypto.a
    include $(PREBUILT_STATIC_LIBRARY)
    

然后,要在另一个 jni 模块中使用该库,请将以下内容添加到它的 Android.mk 文件中:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../openssl/include
LOCAL_STATIC_LIBRARIES := libssl libcrypto

【讨论】:

setenv-android.sh 不适用于 osx 环境,因为它不能保存环境! 应该,这只是一个bash 脚本。确保脚本在正确的路径中并且openssl 库在正确的路径中。 Bash 脚本位于 openssl 的主目录中,在 Yosemetie OSX 上它没有设置环境路径:(【参考方案9】:

我在这里将一些有用的建议整合到一个适用于我的适用于 Android 的 OpenSSL 构建环境中。

支持构建多种架构 - ARM、ARMv7、X86 使用 OpenSSL 源代码 与 Android.mk 构建集成 包含预编译的 OpenSSL 1.0.2h(根据需要使用或自己编译)

https://github.com/ph4r05/android-openssl

【讨论】:

【参考方案10】:

这里是如何使用 Cygwin 和 Android NDK 在 Windows 上构建 OpenSSL

    下载并提取 OpenSSL 源代码 从https://github.com/pstanoev/OpenSSL-For-Android下载脚本

    以管理员用户运行cmd并执行

    SET CYGWIN=winsymlinks:nativestrict

    在同一个cmd窗口,打开Cygwin:

    cygwin.bat

    使脚本可执行:

    chmod +x *.sh

    在 Cygwin 中执行:

    /cygdrive/c/dev/openssl-source/openssl-build.sh /cygdrive/c/dev/android-ndk-r12b /cygdrive/c/dev/openssl-source/openssl-1.0.2j 15 armeabi-v7a 4.9 /home/user/openssl

    针对您的 Android NDK 和源位置进行修改

    将 libcrypto.so 和 include/* 文件复制到此模块。使用cp -r 复制以跟随链接。

【讨论】:

【参考方案11】:

请参考PJSIP Build For Android with Integration of G729 Codec 为Android 编译最新的Openssl。解释得很好。

【讨论】:

欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted. 至少这个链接比其他链接解释得更好...... 这个配方使用了非常旧的 NDK 版本。【参考方案12】:

遵循这些说明可能会有所帮助:)

1:从这个网址下载Android NDK(版本ndk-r13b):

https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip

2:将 NDK 解压到 /home/Android。

3:从此网址下载交叉编译设置脚本:

https://wiki.openssl.org/images/7/70/Setenv-android.sh

4:在 Setenv-android.sh 脚本中进行以下更改:

a: Add the following line to the start of the script
        
        ANDROID_NDK_ROOT=/home/Android/android-ndk-r13b

b: Modify _ANDROID_NDK="android-ndk-r13".

c: Modify _ANDROID_EABI="arm-linux-androideabi-4.9"

d: Modify _ANDROID_API="android-23"

5:从此网址下载openssl(1.0.2n版):

https://www.openssl.org/source/old/1.0.2/openssl-1.0.2n.tar.gz

6:解压下载的压缩包。

7:打开新的终端窗口并导航到提取的目录。

8:将Setenv-android.sh脚本移动到该目录下,执行以下命令:

chmod a+x Setenv-android.sh
source ./Setenv-android.sh

9:运行以下命令(配置 OpenSSL 源以构建 Android):

./Configure shared android

10:执行以下命令构建 libcrypto 和 libssl 共享库。

make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" build_libs

11:让构建成功完成。

【讨论】:

【参考方案13】:

使用 NDK v22 和 openssl-1.0.2o:

export PATH=$(echo -n $ANDROID_NDK/toolchains/llvm/prebuilt/*/bin):$PATH
./Configure android-x86 no-asm
make clean build_libs AR="llvm-ar r" RANLIB="llvm-ranlib" CC=i686-linux-android19-clang CFLAG="-fPIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -D__ANDROID_API__=19 -Os -fomit-frame-pointer -Wall -I$ANDROID_NDK_ROOT/sysroot/usr/include -I$ANDROID_NDK_ROOT/sysroot/usr/include/i686-linux-android"
mkdir -p x86/lib x86/include/openssl
cp lib*.a x86/lib
cp include/openssl/* x86/include/openssl

为 x86 构建静态库

【讨论】:

以上是关于为 Android 编译最新的 OpenSSL的主要内容,如果未能解决你的问题,请参考以下文章

最新最全为 iOS 和 Android 的真机和模拟器编译 Luajit 库

最新最全为 iOS 和 Android 的真机和模拟器编译 Luajit 库

Webrtc入门——基于阿里云ubuntu 最新webrtc Android平台编译详细说明

aubio 是不是可以为 iPhone/Android/ARM 交叉编译? [关闭]

在Ubuntu上下载编译和安装Android最新源代码

RN - 2022年11月4日 - RN官方最新修复Android端编译/构建问题处理