如何在Win32上为Android ARM v7(使用Android NDK)构建OpenSSL?
答案 0 :(得分:1)
在OpenSSL的wiki和setenv-android.sh相应更新之前,我将在此处发布配方。该过程所需的修复程序是:
make
到Cygwin的perl。这个配方将是Cygwin和mingw的奇怪混合(因为win32的Android NDK gcc工具链是mingw)。我假设将Android NDK的Windows x86_64版本解压缩到 c:\ android-ndk-r9d ,并且您希望使用gcc 4.8工具链。
在控制台中,运行以下脚本来设置变量:
export \
CYGWIN=winsymlinks:native \
ANDROID_API=android-14 \
ANDROID_DEV=c:/android-ndk-r9d/platforms/android-14/arch-arm/usr \
PATH=/cygdrive/c/android-ndk-r9d/prebuilt/windows-x86_64/bin:/cygdrive/c/android-ndk-r9d/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin:$PATH \
MACHINE=armv7 \
SYSTEM=android \
ARCH=arm \
CROSS_COMPILE=arm-linux-androideabi-
现在,解压openssl:
tar xzfv openssl-1.0.1i.tar.gz
(或任何你的tarball)cd openssl-1.0.1i
(或您的任何版本)确保在include / openssl中包含实际的原生Win32(!)符号链接:
cmd /c "dir include\openssl"
您应该看到类似的内容:
13-Aug-14 05:59 PM <SYMLINK> aes.h [..\..\crypto\aes\aes.h]
13-Aug-14 05:59 PM <SYMLINK> asn1.h [..\..\crypto\asn1\asn1.h]
(等)
现在是时候配置了:
./config shared -no-ssl2 -no-ssl3 -no-comp -no-hw -no-engine --openssldir=/foo/bar
忽略构建失败(由于未能找到perl)。我们马上纠正这个问题。这样做:
make PERL=$(cygpath -w $(which perl))
现在等待几分钟直到它构建,并且presto,你有你的libcrypto.so等。
答案 1 :(得分:0)
对我的经验只有几点评论: 执行此声明:
PERL = $(cygpath -w $(perl))
cygwin shell中的允许shell将反斜杠解释为转义字符和构建过程扼流圈。为了解决这个问题,我做了以下几点:
$ echo $(cygpath -w $(perl))
生成了perl可执行文件的Windows格式化路径:
C:\ cygwin64 \ BIN \ perl的
然后我将此行添加到上面显示的导出中:
PERL = c:/ cygwin64 / bin / perl \
还有其他方法可以做到这一点,但它有效并且使用上面记录的./config语句解决问题(找不到perl)。
第二个问题是-no-陈述。运行configure后,脚本会报告您必须运行make depend。我想排除MD5(即-no-md5),当我执行make depend时,它会报告MD5被禁用。嗯,是的,这是一个想法,但我不会使用MD5哈希。我确实使用了-no-ssl2并且在make depend之后没有得到任何投诉。
第三个问题,这是一个谜。编译破坏了编译加密,因为它无法找到应该在/crypto/objects/obj_xref.h中定义的符号。当我查看文件时,它是空的。我想在perl脚本中有些东西,但现在没时间调试,因为我是概念阶段的证明。我从我在https://github.com/devpack/openssl-android
获取的补丁中放置了一份副本之后,我的构建运行完成。我没有对此进行测试,它不是一个值得信赖的解决方案,但它确实编译并生成了我需要的静态库,以便为我的客户提供概念验证。
就像更新一样,我使用这些库构建的共享库可以很好地加载到我的目标上。