我尝试按照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?
答案 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