28

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

请让我知道是否有人遇到过类似的问题并获得解决相同问题的解决方案。

4

13 回答 13

56

我真的不建议在官方 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
于 2013-09-02T16:55:54.223 回答
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
于 2013-09-12T19:26:22.727 回答
10

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

于 2015-09-28T12:51:42.950 回答
3

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

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

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

于 2016-09-18T15:46:51.127 回答
1

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

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

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

  3. 修改 setenv-android-mod.sh ->18与 ndk 版本一致

  4. 修改 setenv-android-mod.sh ->40与 Android API 版本一致

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

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

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

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

    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
于 2016-08-26T14:27:29.477 回答
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

于 2012-08-15T01:28:25.787 回答
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 构建静态库

于 2021-03-23T10:03:23.450 回答
0

您可以使用此脚本在 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 行),更改相同的第 225、231、237、243 行 - 只需添加$ANDROID_TOOLCHAIN/到交叉编译路径即可。

运行build-all-arch.sh

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

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

于 2016-06-07T21:09:34.687 回答
0

以下是如何使用 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复制以跟随链接。

于 2016-12-23T12:46:05.650 回答
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 中使用了 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 上,因为您需要针对不同架构使用不同类型的脚本:

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

于 2016-05-05T06:17:16.083 回答
0

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

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

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

2:解压NDK到/home/Android。

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

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:让构建成功完成。

于 2020-12-25T08:18:05.283 回答
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 - 请注意,这应该可以通过旋转预处理器来实现,但我现在放弃了。如果有人想分享正确的魔法,请做!

现在您需要将文件重新 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 内容!

祝你好运!

于 2016-07-30T20:15:25.490 回答
-1

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

于 2020-07-02T12:51:39.367 回答