【问题标题】:Compiling the latest OpenSSL for Android为 Android 编译最新的 OpenSSL
【发布时间】: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$

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

【问题讨论】:

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

标签: android android-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

【讨论】:

【解决方案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 中没有这样的文件或目录”,请关注 stackoverflow.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://stackoverflow.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)

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

    2. 修改文件build-all-arch.sh

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

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

    3. 修改文件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。

        1. 首先,下载OpenSSL兼容版本(&gt; 1.0.2f/1.0.1r)。
        2. this link 下载两个脚本。万一有人想知道他们在做什么(你应该 - 它是一个密码库!!!):他们为每个 android ABI 处理器架构(armeabix86mips 等)构建了 OpenSSL 库。 ..)

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

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

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

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

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

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

          1. 下载并提取 OpenSSL 源代码
          2. https://github.com/pstanoev/OpenSSL-For-Android下载脚本
          3. 以管理员用户运行cmd并执行

            SET CYGWIN=winsymlinks:nativestrict

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

            cygwin.bat

          5. 使脚本可执行:

            chmod +x *.sh

          6. 在 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 和源位置进行修改
          7. 将 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 构建静态库

              【讨论】:

                猜你喜欢
                • 2017-01-31
                • 1970-01-01
                • 2020-01-20
                • 1970-01-01
                • 1970-01-01
                • 2019-03-14
                • 1970-01-01
                • 1970-01-01
                • 2015-04-10
                相关资源
                最近更新 更多