我目前正在使用http://wiki.openssl.org/index.php/Android将我们的OpenSSL项目更新为1.0.1i。
查看配置文件,我发现OpenSSL有2个Android构建选项:android-armv7和android-x86。
我已经能够构建armv7配置,它似乎在Nexus 5和Kindle Fire 1st Gen上正常工作。
我想知道的是,如果它在armeabi目录而不是armeabi-v7a目录中,我的当前库是否可以工作?如果OpenSSL是用armv7构建的,但我的项目库是用老手臂构建的,我无法找到足够的信息。
注意:我的最低API级别是8。
答案 0 :(得分:1)
我想知道的是,如果它在armeabi目录而不是armeabi-v7a目录中,我的当前库是否可以工作?
我认为这里有几个问题。首先,您可以将libssl
和libcrypto
放入armeabi/
。这是一个Android问题(不是OpenSSL问题)。我似乎记得Brian在NDK邮件列表上谈到这个问题(但我目前无法找到它)。我相信这个想法是armeabi/
是一个后备,如果找不到更具体的库,例如armeabi-v7a/
。
其次,您是否可以在其他平台上运行ARMv7a版本的libssl
和libcrypto
。我相信ARMv7a在ARMv7上添加了一些管理程序扩展,所以你应该没问题,因为OpenSSL不使用它们。但是,如果在使用ARMv6或ARMv5的旧设备上运行,您可能会遇到麻烦。
在这种情况下,您可能希望下载为ARMv5构建的旧版NDK,然后将libssl
和libcrypto
的ARMv5版本放在armeabi/
中。您可以在Android NDK找到旧版本的NDK,大约是页面的三分之一。
更具体地说,Android 2.2是API 8,它是在2010年5月左右发布的。所以你可能想要从2010年3月开始使用Android NDK Revision 3进行获取和构建.NDK R3仅支持armeabi
并且有针对性ARMv5TE(来自CPU-ARCH-ABIS.TXT
文件)。下载是http://dl.google.com/android/ndk/android-ndk-r3-linux-x86.zip。
OpenSSL不遵循Standalone Toolchain对ARMv7a的说明。它遗漏了-mfloat-abi=softfp
标志。您可能无法调用将float从Java传递到库的函数。它们并不多,但其中一个是RAND_add
。熵估计作为浮点数传递,在不兼容之后,您的估计值可能为0.0f。请参阅NDK邮件列表中的Hard-float and JNI和[Bug #3080]: Android NEON and CFLAGS options。
以下是自述文件中您应该注意的说明:
III.3. Automatic extraction of native code at install time:
-----------------------------------------------------------
When installing an application, the package manager service will scan
the .apk and look for any shared library of the form:
lib/<abi>/lib<name>.so
If one is found, then it is copied under $APPDIR/lib/lib<name>.so,
where $APPDIR corresponds to the application's specific data directory.
如果您更新APK并且没有任何更改,请务必删除lib\
下的任何内容或首先删除APK(他们倾向于成为&#34;粘贴&#34;)。
您可能遇到的另一个问题是构建和编译1.0.1。确保提供具有不同名称的包装器共享对象。否则,您可能会在运行时链接0.9.8,而不是APK中的1.0.1档。这是因为Zygote加载了Android的OpenSSL版本,该版本为0.9.8。后来,当Zygote要求创建你的进程时,链接加载器不会映射你的OpenSSL版本,因为它已经存在于Zygote中。
OpenSSL有2个Android构建选项:android-armv7和android-x86
我在2014年6月向脚本添加了android-x86
。我能够通过一个补丁来完成构建:[Bug #3398] PATCH: fix broken compile on android-x86 with no-comp configure option。我没有x86 Android设备,所以我无法在设备上运行自检。欢迎提供反馈。