Android.mk无法与libcrypto链接

时间:2014-01-10 08:52:02

标签: android android-ndk openssl libcrypto android.mk

案例:

我正在构建一个使用libcryptolibssl的应用。我正在尝试使用预构建的libcrypto.solibssl.so并编译我的应用程序。

但我一直得到未定义的引用错误。

我的应用/ Android.mk

LOCAL_PATH := $(call my-dir)
my_LOCAL_PATH := $(LOCAL_PATH)
include $(call all-subdir-makefiles)
LOCAL_PATH := $(my_LOCAL_PATH)
common_SRC_FILES := \
    src/foo.c
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../openssl/include
LOCAL_SHARED_LIBRARIES += mylibssl mylibcrypto
include $(BUILD_STATIC_LIBRARY)

我的应用/ mylibssl / Android.mk

构建mylibssl [来自预建的libssl.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibssl
LOCAL_SRC_FILES := libssl.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../openssl/include
include $(BUILD_PREBUILT)

我的应用/ mylibcrypto / Android.mk

构建mylibcrypto [来自预建的libcrypto.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibcrypto
LOCAL_SRC_FILES := libcrypto.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../openssl/include
include $(BUILD_PREBUILT)

我一直

error: undefined reference to 'BIO_new_mem_buf'
error: undefined reference to 'PEM_read_bio_X509_AUX'
error: undefined reference to 'BIO_free'
...

我花了几个小时试图找出并完全陷入困境。请帮忙!

1 个答案:

答案 0 :(得分:0)

  

我正在构建一个使用libcrypto和libssl的应用程序......但是我一直在获取未定义的引用错误。

error: undefined reference to 'BIO_new_mem_buf'
error: undefined reference to 'PEM_read_bio_X509_AUX'
error: undefined reference to 'BIO_free'

这些是链接器错误,意味着您没有链接到OpenSSL库。它可能是一个路径问题,假设你有一个Android版本的OpenSSL库可用。


如果您需要Android版本的OpenSSL库,那么您可以自己构建它或在Github上找到它。要自己构建它,请参阅FIPS Library and Android(只需忽略FIPS的内容)。所需的步骤是(并在运行脚本时注意前导点“。”):

cd openssl-1.0.1f/
wget http://wiki.openssl.org/images/7/70/Setenv-android.sh
chmod a+x *.sh
. ./setenv-android.sh

./config shared no-ssl2 no-hw no-engine --openssldir=/usr/local/ssl/android-18/ <other options>
make depend
make all

对于选项二,您可以使用https://www.google.com/q=openssl+android+site:github.com搜索Github。


Building mylibcrypto [from a prebuilt libcrypto.so]

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylibcrypto
LOCAL_SRC_FILES := libcrypto.so

这不会产生预期的结果,如果让它发挥作用,可能会导致崩溃。问题是Android使用0.9.8,你可能正在建立1.0.1。

Zygote在启动时加载OpenSSL 0.9.8(它是所有Android Java程序的父级)会发生什么。当您的应用程序启动时,Zygote是分叉的,因此OpenSSL已经映射到地址空间。这意味着你没有加载你携带的OpenSSL版本。之后,你崩溃了,因为0.9.8和1.0.1不是二进制兼容的(即,它们是ABI不兼容的)。

构建包装器共享对象(mylibcrypto.so)是正确的。但是,mylibcrypto.so需要静态链接OpenSSL以避免上述问题。也就是说,mylibcrypto.so需要与libcrypto.alibssl.a进行关联。