Компиляция последней версии 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$
Пожалуйста, дайте мне знать, если кто-то столкнулся с подобной проблемой и получил решение для решения этой проблемы.
Ответы
Ответ 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
-
Изменить файл 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
для копирования, чтобы следовать ссылкам.