为Android构建OpenSSL

时间:2014-01-31 07:48:14

标签: android android-ndk java-native-interface openssl

我尝试按照this answer中的描述为arm Android构建OpenSSL。但是,当我使用“shared”标志构建OpenSSL时,它会生成4个文件:libcrypto.so.1.0.0,libssl.so.1.0.0和2个符号链接:libcrypto.so和libssl.so

在Android.mk文件中,我将这些库链接到项目:

include $(CLEAR_VARS)
LOCAL_MODULE    := openssl-ssl
LOCAL_SRC_FILES := libs/libssl.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := openssl-crypto
LOCAL_SRC_FILES := libs/libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)

但是当我尝试运行我的应用程序时,会出现java.lang.UnsatisfiedLinkError,并显示消息“无法加载库libssl.so.1.0.0 ...”

我尝试删除链接并将libssl.so.1.0.0和libcrypto.so.1.0.0分别重命名为libssl.so和libcrypto.so,但它没有帮助。

如何在我的项目中使用OpenSSL?

4 个答案:

答案 0 :(得分:2)

对我有用的是: 编辑openssl Makefile.shared并替换

-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX

-soname=$$SHLIB

这样库的内部名称改为libcrypto.so和libssl.so而不是libcrypto.so.1.0.0

清理并重新编译openssl和您的应用程序。

答案 1 :(得分:1)

为了安全起见,请使用openssl的静态构建。否则,您可能会发现加载了系统而不是自定义系统(System.loadLibrary()首先查看/system/lib)。或者进入openssl make文件并将其 soname 更改为唯一的。

答案 2 :(得分:0)

您无需删除链接并重命名文件。只需将它们保存在Android.mk文件中引用的同一文件夹中。(在您的情况下,这四个文件都应该在lib文件夹中)

答案 3 :(得分:0)

您需要构建库的静态版本。 libcrypto.a和libssl.a无法加载自定义libcrypto.so和libssl.so,因为Android Zygote进程已经加载了自己的这些共享库版本。

我目前在Android上使用的OpenSSL-1.0.2k配置:

ARM:./Configure android no-shared no-hw no-dso no-krb5 no-zlib --openssldir=/home/jeff/openssl/$ANDROID_API

ARM-v7a:./Configure android-armv7 no-shared no-hw no-dso no-krb5 no-zlib --openssldir=/home/jeff/openssl/$ANDROID_API

x86:./Configure android-x86 no-shared no-hw no-dso no-krb5 no-zlib --openssldir=/home/jeff/openssl/$ANDROID_API