编译最新的OpenSSL for Android

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

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

Solutions Collecting From Web of "编译最新的OpenSSL for Android"

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

在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 

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

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

  • 支持多种体系结构的构建 – ARM,ARMv7,X86
  • 使用OpenSSL源代码
  • 与Android.mk构建集成
  • 包含预编译的OpenSSL 1.0.2h(如果你想要或编译你自己使用)

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

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

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

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

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

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

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

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

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

  1. 包含lib/ jni目录下的openssl文件夹(包含支持的体系结构的.a文件),
  2. include/具有必要的包含(您可以在下载的openssl版本下find,请注意某些头文件是符号链接)
  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 

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

这就是我为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= $ 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中的ff路径值。 sh文件:

 _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,因为你需要不同types的脚本用于不同的架构:

对于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

您可以使用此脚本在Windows 7 + Cygwin下编译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行),更改相同的行export CROSS_COMPILE="$ANDROID_TOOLCHAIN/aarch64-linux-android-" – 只需将$ANDROID_TOOLCHAIN/添加到十字架编译路径。

运行build-all-arch.sh

所有库( *.so )都位于/prebuilt/ dir中。

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

这个问题和许多其他类似问题导致我大约一周左右的时间,但我终于破解了它,所以我想我会分享我的解决方案。 如果您愿意破解代码,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; } 

注意信号function可能更好,但对我们来说并不重要。 这样可以阻止4.03设备上可怕的“无法find符号”错误,这些错误是由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> ../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内容!

祝你好运!

以下是如何使用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并将/ *文件包含到此模块中。 使用cp -r进行复制以跟踪链接。