Подтвердить что ты не робот

Компиляция последней версии OpenSSL для Android

Я пытаюсь создать общую библиотеку для (.so) файлов OpenSSL1.0.1c для Android. Я обнаружил, что они добавили три варианта компиляции для Android в андроид script.

./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$

Пожалуйста, дайте мне знать, если кто-то столкнулся с подобной проблемой и получил решение для решения этой проблемы.

4b9b3361

Ответ 1

Я бы серьезно не советовал брать что-либо за пределами официального веб-сайта OpenSSL. Вы не можете рисковать при работе с криптографией и безопасностью.

Единственная проблема, которую я вижу, заключается в том, что вы используете свой хост gcc вместо использования компиляторов с поддержкой android.

Вот как я бы скомпилировал официальный OpenSSL на Ubuntu 14.04LTS (это работает с 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} "

И затем запустите конфигурацию script:

./Configure android-armv7

И затем постройте

PATH=$TOOLCHAIN_PATH:$PATH make

Вы должны увидеть, что вместо gcc

используется arm-linux-androideabi-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

Ответ 2

В 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

Ответ 3

Благодаря инструкциям, опубликованным здесь, а также некоторым другим дополнениям, я создал автоматизированный script, который собирает последнюю библиотеку OpenSSL для Android с поддержкой: armeabi, armeabi-v7a, x86, x86_64 и arm64-v8a:

#!/bin/bash -e
#@author Aleksandar Gotev ([email protected])
#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

Script docs: https://github.com/alexbbb/pjsip-android-builder#build-only-openssl

Для проверки последней версии: https://github.com/alexbbb/pjsip-android-builder/blob/master/openssl-build

Ответ 4

Если кто-то сталкивается с проблемой использования уязвимой версии OpenSSL (< 1.0.2f/1.0.1r) в одной из родных библиотек, я добавляю несколько подробностей и инструкций.

Предпосылки: сначала нужно настроить Android NDK.

  • Прежде всего, загрузите OpenSSL совместимую версию (> 1.0.2f/1.0.1r).
  • Загрузите два сценария из эту ссылку. Если кто-то задается вопросом, что они делают (и вам нужно - это криптографическая библиотека!!!): они строят библиотеку OpenSSL для каждой архитектуры процессора ABI (armeabi, x86, mips и т.д.)...)

  • Измените setenv-android-mod.sh → line 18 с версией ndk

  • Измените setenv-android-mod.sh → line 40 на версию Android API

  • Измените build-all-arch.sh → строку 7 с именем папки библиотеки OpenSSL (в моем случае это было openssl-1.0.1t)

  • После успешной сборки внутри папки dist будут присутствовать библиотеки

Чтобы добавить проект OpenSSL в качестве готовых статических библиотек, создайте:

  • OpenSSL в каталоге jni, содержащем lib/ (который содержит файлы .a для поддерживаемых архитектур),
  • include/, который содержит необходимые сведения (вы можете обнаружить, что в загруженной версии openssl имейте в виду, что некоторые из файлов заголовков являются символическими ссылками)
  • Измените 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

Ответ 5

Я прикрепил несколько полезных советов к среде сборки для OpenSSL для Android, которая работает для меня.

  • Поддержка построения для нескольких архитектур - ARM, ARMv7, X86
  • Использует исходные коды OpenSSL
  • Интегрировано с Android.mk build
  • Содержит предварительно скомпилированный OpenSSL 1.0.2h (используйте, если хотите или скомпилируйте свой собственный)

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

Ответ 6

Это не решает вашу проблему, но, возможно, это поможет. Сообщение группы google, где они успешно скомпилировали OpenSSL 1.0.1 beta2 для Android.

https://groups.google.com/forum/?fromgroups#!topic/android-security-discuss/5-_gCAmEo-M

Это также может помочь, проект с открытым исходным кодом, который создает 1.0.0a для Android:

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

Ответ 7

Вот как я это сделал для 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 

Убедитесь, что вы ввели правильные пути NDK в ваш setenv-android.sh, иначе у вас появятся ошибки.

Пример для этой сборки Я использовал Android NDK vr10b (http://dl.google.com/android/ndk/android-ndk32-r10b-darwin-x86.tar.bz2)  и использовал значения ff-пути внутри моего файла setenv-android.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

Ответ 8

Вы можете использовать этот script для компиляции openssl под Windows 7 + Cygwin. Все, что вам нужно, это только изменение местоположения ndk и выбор версии Android для Android.

Мой путь шаг за шагом (Win 7 x64 + Cygwin + ndk r10c)

  • Скопируйте файл setenv-android-mod.sh и build-all-arch.sh в каталог openssl.

  • Изменить файл build-all-arch.sh

    • cd openssl-1.0.1j to #cd openssl-1.0.1j (строка 56)

    • cd .. to #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-" to export CROSS_COMPILE="$ANDROID_TOOLCHAIN/aarch64-linux-android-" (строка 219), измените те же строки 225, 231, 237, 243 - просто добавьте $ANDROID_TOOLCHAIN/ к пути перекрестной компиляции.

Запустите build-all-arch.sh.

Все библиотеки (*.so) будут расположены в директории /prebuilt/.

P.S. У меня было еще несколько ошибок из-за неправильных символических ссылок, но после завершения следующей команды export CYGWIN="winsymlinks:native" см. здесь.

Ответ 9

Эта проблема и многие другие, подобные мне, вызвали у меня неделю или около того, но я, наконец, взломал ее, поэтому я решил поделиться своим решением. OpenSSL можно скомпилировать для 21+ и работать на устройствах Android 4.03, если вы хотите взломать код. Мы используем libcurl, поэтому хотим быть в курсе последних событий. Этапы немного сложны:

Сначала убедитесь, что у вас есть встроенная версия libcurl. Я рекомендую в качестве хорошей отправной точки https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src

Они поддерживают современные скрипты сборки.

Сначала взломайте android.ini в "build" до версии 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).

Далее загрузите tar.gz для версии openssl, которую вы хотите создать и распаковать. Измените crypto/ui/ui_openssl.c и crypto/des/read_pwd.c и убедитесь, что #defines для tcsetattr не используются. Я использовал грубую силу #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 может прочитать это и исправить проект, чтобы он разбирался в Android-релизе, выпущенном 2 года назад!

Удачи!

Ответ 10

Вот как построить OpenSSL для Windows с помощью Cygwin и Android NDK

  • Загрузка и извлечение источника OpenSSL
  • Загрузите script из https://github.com/pstanoev/OpenSSL-For-Android
  • Запустите cmd с пользователем Administrator и выполните

    SET CYGWIN=winsymlinks:nativestrict

  • В том же окне cmd откройте Cygwin:

    cygwin.bat

  • Сделайте script исполняемый файл:

    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

    • Изменить для местоположения Android NDK и источников
  • Скопируйте libcrypto.so и включите /* файлы в этот модуль. Используйте cp -r для копирования, чтобы следовать ссылкам.