编译最新的OpenSSL for Android

时间:2012-08-13 07:21:27

标签: android android-ndk openssl

我正在尝试为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$

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

13 个答案:

答案 0 :(得分:52)

我真的不建议在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

为老阿米巴建造:

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

答案 1 :(得分:15)

在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

答案 2 :(得分:8)

感谢此处发布的说明以及其他一些补充内容,我制作了一个自动脚本,编译最新的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

答案 3 :(得分:2)

我在这里将一些有用的建议粘贴到适合我的OpenSSL for Android的构建环境中。

  • 支持多种体系结构的构建 - ARM,ARMv7,X86
  • 使用OpenSSL源代码
  • 与Android.mk build
  • 集成
  • 包含预编译的OpenSSL 1.0.2h(如果需要,可以自行编译)

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

答案 4 :(得分:1)

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

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

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

  3. 修改setenv-android-mod.sh - &gt;使用ndk版本

  4. 18
  5. 修改setenv-android-mod.sh - &gt;使用Android API版

  6. 40
  7. 修改build-all-arch.sh - &gt; 7文件夹的OpenSSL行{在我的情况下是openssl-1.0.1t

  8. 成功构建后,文件夹dist内将存在库

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

      包含openssl的{​​{1}}目录下的
    1. jni文件夹(包含支持的体系结构的lib/文件),
    2. .a有必要的包含(您可以在下载的openssl版本下找到,请注意某些头文件是符号链接)
    3. 修改include/文件夹中的Android.mk,添加以下内容:

      jni
    4. 然后,要在另一个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

答案 5 :(得分:0)

这并不能解决您的问题,但也许会有所帮助。一个谷歌小组发布他们已成功编译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

答案 6 :(得分:0)

这就是我为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

注意---&gt; 我创建了一个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

答案 7 :(得分:0)

您可以使用this script在Windows 7 + Cygwin下编译openssl。你需要的只是改变ndk的位置并选择android api version。

我的方法一步一步(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/添加到交叉编译路径。
  4. 运行build-all-arch.sh

    所有图书馆(*.so)都位于/prebuilt/目录。

    P.S。由于错误的符号链接,我还有一些错误,但执行以下命令export CYGWIN="winsymlinks:native"后一切正常,请参阅here了解详细信息。

答案 8 :(得分:0)

这个问题和许多其他类似问题导致我一周左右的时间,但我终于破解了它,所以我想我会分享我的解决方案。如果您愿意破解代码,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 - 请注意这应该可以通过使用预处理器,但我放弃了这一点。如果有人想分享正确的魔法,请做!

现在你需要将文件重新打包到tarballs文件中(确保你在那里获得根文件夹:

并运行(在我的情况下)

shasum -a 512 curl-7.50.0.tar.gz&gt; ../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内容!

祝你好运!

答案 9 :(得分:0)

以下是如何使用Cygwin和Android NDK在Windows上构建OpenSSL

  1. 下载并解压缩OpenSSL源
  2. https://github.com/pstanoev/OpenSSL-For-Android
  3. 下载脚本
  4. 使用管理员用户运行cmd并执行

    SET CYGWIN=winsymlinks:nativestrict

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

    cygwin.bat

  6. 使脚本可执行:

    chmod +x *.sh

  7. 在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和来源的位置
  8. 复制libcrypto.so并将/ *文件包含到此模块中。使用cp -r复制以关注链接。

答案 10 :(得分:0)

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

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

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

2:将 NDK 提取到 /home/Android。

3:从这个 URL 下载交叉编译安装脚本:

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"

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

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

5:从这个 url 下载 openssl(版本 1.0.2n):

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

6:解压下载的压缩包。

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

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

./Configure shared android

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

make CALC_VERSIONS="SHLIB_COMPAT=; SHLIB_SOVER=" build_libs

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

v-model

11:让构建成功完成。

答案 11 :(得分:0)

使用 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 构建静态库

答案 12 :(得分:-1)

有关编译最新的Android Openssl的信息,请参阅PJSIP Build For Android with Integration of G729 Codec。解释得很好。