Android NDK OpenSSL 错误交叉编译

Android NDK OpenSSL error cross-compiling

我是 NDK 的新手,我正在按照此 guide 为 Android 构建 OpenSSL,为此我正在使用 Windows 7 和 Cygwin。

我在尝试构建 OpenSSL 库时遇到错误。

# From the 'root' directory
$ . ./setenv-android.sh
$ cd openssl-1.0.1g/

$ 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=/usr/local/ssl/$ANDROID_API

$ make depend
$ make all

当我尝试 make depend 命令时出现 2 个错误:

cryptlib.c:171:3: error: #error "Inconsistency between crypto.h and cryptlib.c" # error "Inconsistency between crypto.h and cryptlib.c"

cryplib.c 第 171 行说:

#if CRYPTO_NUM_LOCKS != 41
# error "Inconsistency between crypto.h and cryptlib.c"
#endif

我不知道如何修复该错误。

另一个是uid.c:77:10: error: #include expects "FILENAME" or <FILENAME> #include OPENSSL_UNISTD

如果我将 uid.c 中的第 77 行更改为 #include <unistd.h> 我会在 Makefile 中遇到错误,所以我不知道是否可以修复它,错误取决于生成文件。

depend:
    @[ -z "$(THIS)" -o -f buildinf.h ] || touch buildinf.h # fake buildinf.h if it does not exist
    @[ -z "$(THIS)" ] || $(MAKEDEPEND) -- $(CFLAG) $(INCLUDE) $(DEPFLAG) -- $(PROGS) $(LIBSRC)
    @[ -z "$(THIS)" -o -s buildinf.h ] || rm buildinf.h
    @[ -z "$(THIS)" ] || (set -e; target=depend; $(RECURSIVE_MAKE) )
    @if [ -z "$(THIS)" ]; then $(MAKE) -f $(TOP)/Makefile reflect THIS=$@; fi

另一个问题是我是否可以使用本指南将 OpenSSL 库构建到 64 位架构。 (x86_64、arm64 和 mips64)我还没有在这些体系结构中找到有关 Android 的 OpenSSL 的信息,所有 post 都是旧的,[=62 的那些拱门不存在=]

编辑

我找到了一种方法来部分解决我的问题(不是最好的,但它有效),问题是由于某些路径中的一些错误,因为我试图在 Windows 和一些文件上使用 Cywin (我不知道哪些)试图到达一些不存在的路径,因为我在 Windows 而不是 Linux,所以我只是在虚拟机上安装 Ubuntu并再次尝试此 guide,我可以编译库并且我有 libcrypto.a libcrypto.so libssl.a libssl.so for Android ARM,x86,mips, ARM64 和 x86_64 架构。

但是这些库不适用于 x86_64 和 ARM64,当我尝试使用 android.mk 为 x86_64 或 arm64 eabi 编译 .c 时,它无法编译由于一些兼容性错误,但是如果尝试使用 "x86_64" 或 "arm-64" 为 x86 或 arm eabi 编译相同的 .c 文件,它会编译,所以它们仍然是 32 位库,这不是答案是因为我需要所有架构的库(至少对于 armv5、armv7、armv8-64、x86,x86_64),这只是一小步。

我会更新以帮助遇到同样问题的人,如果有人想帮助我。

When I try the make depend command I have 2 errors:

cryptlib.c:171:3: error: #error "Inconsistency between crypto.h and cryptlib.c"
# error "Inconsistency between crypto.h and cryptlib.c"

符号链接有问题。使用 tar zxvf 再次解压缩 tarball。然后,验证头文件是 而不是 0 长度。

另请参阅 Stack Overflow 上的 Inconsistency between crypto.h and cryptlib.c on the OpenSSL mailing list. And How to copy symbolic link file from Linux to Windows and then back to Linux but still keeping it as a symbolic link

使用此 guide 并修改文件 setenv-android.sh 您可以轻松地为 arm、x86 和 mips 编译 openssl。

您只需修改_ANDROID_NDK _ANDROID_ARCH _ANDROID_EABI _ANDROID_API个参数

注意:对于mips,你必须在文件中添加一些行

第 120 行附近:

 arch-mips)   
  ANDROID_TOOLS="mipsel-linux-android-gcc mipsel-linux-android-ranlib mipsel-linux-android-ld"
;;

200 行左右:

if [ "$_ANDROID_ARCH" == "arch-mips" ]; then
   export MACHINE=mipsel
   export RELEASE=2.6.37
   export SYSTEM=android
   export ARCH=mips
   export CROSS_COMPILE="mipsel-linux-android-"
fi

如果您按照指南进行操作,您将获得 libcrypto.a、libssl.a、libcrypto.so 和 libssl.so。

如果你想要 64 位架构的库,你可以使用 adb 从设备中拉取,所有 android 设备在 /system/lib64 中都有 libcrypto.so 和 libssl.so对于 64 位版本(仅在 64 位设备中)和 /system/lib 32 位版本,如果您需要静态库的 64 位版本(libcrypto.a 和 libssl.a) 在这个 link 你可以找到方法。