在Win32上构建适用于Android的OpenSSL(ARMv7)

时间:2014-08-13 17:03:54

标签: android openssl

如何在Win32上为Android ARM v7(使用Android NDK)构建OpenSSL?

2 个答案:

答案 0 :(得分:1)

在OpenSSL的wiki和setenv-android.sh相应更新之前,我将在此处发布配方。该过程所需的修复程序是:

  1. 更新setenv-android.sh以支持Windows。
  2. 更新PATH以使用Android NDK(mingw)GNU make(而不是Cygwin)。
  3. 使用Windows样式的路径调用make到Cygwin的perl。
  4. 这个配方将是Cygwin和mingw的奇怪混合(因为win32的Android NDK gcc工具链是mingw)。我假设将Android NDK的Windows x86_64版本解压缩到 c:\ android-ndk-r9d ,并且您希望使用gcc 4.8工具链。

    1. 安装Android NDK(呃!)。
    2. 安装Cygwin - 确保包含 perl
    3. 以管理员身份启动Cygwin shell,以确保本机符号链接正常工作。
    4. 在控制台中,运行以下脚本来设置变量:

      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:

      1. tar xzfv openssl-1.0.1i.tar.gz(或任何你的tarball)
      2. cd openssl-1.0.1i(或您的任何版本)
      3. 确保在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

获取的补丁中放置了一份副本

之后,我的构建运行完成。我没有对此进行测试,它不是一个值得信赖的解决方案,但它确实编译并生成了我需要的静态库,以便为我的客户提供概念验证。

就像更新一样,我使用这些库构建的共享库可以很好地加载到我的目标上。