为 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 clean
在make
之前解决【参考方案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.sh
和build-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 (< 1.0.2f/1.0.1r
) 的问题,我会添加更多详细信息和说明。
前提条件:需要先配置Android NDK。
-
首先,下载
OpenSSL
兼容版本(> 1.0.2f/1.0.1r
)。
从this link 下载两个脚本。万一有人想知道他们在做什么(你应该 - 它是一个密码库!!!):他们为每个 android ABI 处理器架构(armeabi
、x86
、mips
等)构建了 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
将 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平台编译详细说明