【问题标题】:Android NDK: building static library with other static librariesAndroid NDK:与其他静态库一起构建静态库
【发布时间】:2017-11-09 11:53:36
【问题描述】:

我想做的很简单:

我已经为 android 编译了 openssl,并且我有一些自定义代码想要构建到包含 openssl 预构建库的静态库中。 这就是我设置 Android.mk 文件的方式:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := a-ssl
LOCAL_SRC_FILES := {PATH_TO_PROJECT}/vendor/android-openssl/prebuilt/$(TARGET_ARCH_ABI)/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := a-crypto
LOCAL_SRC_FILES := {PATH_TO_PROJECT}/vendor/android-openssl/prebuilt/$(TARGET_ARCH_ABI)/libssl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := a-ssl a-crypto
LOCAL_C_INCLUDES += {PATH_TO_PROJECT}/vendor/android-openssl/openssl/include
LOCAL_MODULE := project-alib
LOCAL_SRC_FILES := ../../source.c
include $(BUILD_STATIC_LIBRARY)

现在可以了,但是它根本不包含 openssl 库。如果我将$(BUILD_STATIC_LIBRARY 更改为$(BUILD_SHARED_LIBRARY),那么看起来所有内容都已正确组合到该共享库中。

但这不是我的项目规范中的内容。

也许我做错了什么?

解决方案编辑

实际上已经找到了可能的解决方案。只需在构建静态库时不要添加静态库,而是在构建实际的 Android 包装器时添加它们,如下所示:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := project-alib
LOCAL_SRC_FILES := {PATH_TO_PROJECT}/project-alib/$(TARGET_ARCH_ABI)/libproject-alib.a
LOCAL_EXPORT_C_INCLUDES := ../../includes
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := a-crypto
LOCAL_SRC_FILES := {PATH_TO_PROJECT}/vendor/android-openssl/prebuilt/$(TARGET_ARCH_ABI)/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := a-ssl
LOCAL_SRC_FILES := {PATH_TO_PROJECT}/vendor/android-openssl/prebuilt/$(TARGET_ARCH_ABI)/libssl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := project-alib-wrapper
LOCAL_C_INCLUDES += {PATH_TO_PROJECT}/includes
LOCAL_SRC_FILES := wrapper.c
LOCAL_STATIC_LIBRARIES := project-alib a-ssl a-crypto
include $(BUILD_SHARED_LIBRARY)

它会起作用的。 希望其他任何做出相同错误假设的人都可以轻松地使用其他静态库构建静态库。

【问题讨论】:

  • 更正:ndk-build 不(尚)支持合并静态库。继续,将您的答案作为实际答案并将其标记为正确。这是完全可以接受的。

标签: android android-ndk


【解决方案1】:

NDK 有你需要的命令,叫做LOCAL_EXPORT_STATIC_LIBRARIES

include $(CLEAR_VARS)
LOCAL_EXPORT_STATIC_LIBRARIES := a-ssl a-crypto
LOCAL_C_INCLUDES += $(PATH_TO_PROJECT)/vendor/android-openssl/openssl/include
LOCAL_MODULE := project-alib
LOCAL_SRC_FILES := ../../source.c
include $(BUILD_STATIC_LIBRARY)

您还可以从 a-ssl 继承 openssl 包含路径。最后,为了进一步清理它,请考虑更改 Android.mk 中的模块顺序:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_EXPORT_STATIC_LIBRARIES := a-ssl a-crypto
LOCAL_MODULE := project-alib
LOCAL_SRC_FILES := ../../source.c
include $(BUILD_STATIC_LIBRARY)

LOCAL_PATH := $(PATH_TO_PROJECT)/vendor/android-openssl

include $(CLEAR_VARS)
LOCAL_MODULE := a-ssl
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/openssl/include
LOCAL_SRC_FILES := $(LOCAL_PATH)/prebuilt/$(TARGET_ARCH_ABI)/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := a-crypto
LOCAL_SRC_FILES := $(LOCAL_PATH)/prebuilt/$(TARGET_ARCH_ABI)/libssl.a
include $(PREBUILT_STATIC_LIBRARY)

【讨论】:

  • 非常感谢。我基本上混合了我自己的解决方案和你的解决方案。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
相关资源
最近更新 更多