Android.mk 无法与 libcrypto 链接

标签 android android-ndk openssl libcrypto android.mk

案例:

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

但我不断收到 undefined reference 错误。

我的应用/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'
...

我花了几个小时试图弄清楚,但完全被困住了。请帮忙!

最佳答案

I am building an app which uses libcrypto and libssl... But I keep getting undefined reference errors.

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

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


如果您需要 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 被 fork ,因此 OpenSSL 已经映射到地址空间。这意味着您随身携带的 OpenSSL 版本未加载。后来,你崩溃了,因为 0.9.8 和 1.0.1 不是二进制兼容的(即,它们是 ABI 不兼容的)。

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

关于Android.mk 无法与 libcrypto 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039729/

相关文章:

使用 fragment 的 Android 功能区菜单

android - 对于 Android,CMAKE_SYSTEM_VERSION 是指最低 api 级别还是目标 api 级别?

c - 如何使用 NDK 在 ARM 内联汇编中执行简单循环?

azure - 通过 Azure 设置 SSL 证书后运行本地主机的问题

Node.js https.get via proxy 生成SSL3_GET_RECORD wrong version number错误

Android Instrumented 测试断言 Activity 是否启动

android - SignalR:从数据库向用户ID发送消息

java - Android 问题基于套接字动态更新 ListView

android - 如何为 Android shell 构建可执行文件

php - 发送 TLS 电子邮件时 Laravel 证书验证错误