Android NDK OpenSSL错误交叉编译

时间:2015-04-30 14:12:44

标签: c windows android-ndk openssl 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中收到错误,因此我不知道是否有解决方法,错误是在依赖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位arch。 (x86_64,arm64和mips64)我还没有在这些架构中找到有关OpenSSL for Android的信息,所有关于它的帖子都很旧而且那些Android并不存在于Android

修改

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

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

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

2 个答案:

答案 0 :(得分:0)

  

当我尝试make depend命令时,我有2个错误:

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

符号链接存在问题。使用tar zxvf再次解压缩压缩包。然后,验证头文件 0长度。

另请参阅OpenSSL邮件列表中的Inconsistency between crypto.h and cryptlib.c。而Stack Overflow上有How to copy symbolic link file from Linux to Windows and then back to Linux but still keeping it as a symbolic link

答案 1 :(得分:0)

使用此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位版本,你可以使用一个模拟器,如果你想在这个link中找到64位版本的静态库(libcrypto.a和libssl.a),你可以找到这样做的方法。