我正在尝试为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$
如果有人遇到类似的问题,请告诉我,并找到解决问题的解决方案。
答案 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的构建环境中。
答案 4 :(得分:1)
如果有人遇到在其中一个本机库中使用易受攻击的OpenSSL版本(< 1.0.2f/1.0.1r
)的问题,我会添加更多详细信息和说明。
前提条件:首先需要配置Android NDK。
OpenSSL
兼容版本(> 1.0.2f/1.0.1r
)。从this link下载两个脚本。万一有人想知道他们做了什么(你应该 - 它是一个加密库!!!):他们为每个机器人ABI处理器架构(OpenSSL
,armeabi
构建x86
库, mips
等等......)
修改setenv-android-mod.sh - &gt;使用ndk版本
18
修改setenv-android-mod.sh - &gt;使用Android API版
40
修改build-all-arch.sh - &gt; 7
文件夹的OpenSSL
行{在我的情况下是openssl-1.0.1t
)
成功构建后,文件夹dist
内将存在库
要将openSSL
添加到项目作为预构建的静态库,请创建:
openssl
的{{1}}目录下的jni
文件夹(包含支持的体系结构的lib/
文件),.a
有必要的包含(您可以在下载的openssl版本下找到,请注意某些头文件是符号链接)修改include/
文件夹中的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
答案 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的开源项目:
答案 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)
将文件setenv-android-mod.sh
和build-all-arch.sh
复制到您的openssl目录。
修改档案build-all-arch.sh
cd openssl-1.0.1j
至#cd openssl-1.0.1j
(第56行)
cd ..
至#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-"
到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"
后一切正常,请参阅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
使用管理员用户运行cmd
并执行
SET CYGWIN=winsymlinks:nativestrict
在同一个cmd窗口中,打开Cygwin:
cygwin.bat
使脚本可执行:
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
复制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。解释得很好。