【问题标题】:Android NDK: how to build and then use a prebuilt libraryAndroid NDK:如何构建然后使用预构建库
【发布时间】:2014-03-27 17:07:06
【问题描述】:

我已经阅读了很多关于如何使用 Android.mk 系统共享预建库的帖子。解决方案归结为两个步骤:

  1. 包含已构建库的目录使用 *include $(PREBUILT_SHARED_LIBRARY)*
  2. 使用该库的项目使用 *LOCAL_SHARED_LIBRARIES*

(您可以将“STATIC”替换为“SHARED”来构建和使用 .a 而不是 .so)

我想要做的是添加第 0 步:从源代码构建库。如果我更改了对库有贡献的源文件,我希望 Android.mk 系统按顺序执行步骤 0、1 和 2。

我在 Eclipse/ADT 中有两个项目:

  1. MyApp - 使用 MyLibrary
  2. MyLibrary - 包含库的源文件

我在这里提出的问题集中在 MyLibrary 项目上。这是 MyLibrary 的 Android.mk:

LOCAL_PATH := $(call my-dir)

# step 0: build my library

include $(CLEAR_VARS)
LOCAL_MODULE := mylibrary
LOCAL_LDLIBS := -llog
LOCAL_SRC_FILES := libsrc1.c libsrc2.c
include $(BUILD_SHARED_LIBRARY)

# step 1: export my library (PREBUILT_SHARED_LIBRARY):

include $(CLEAR_VARS)
LOCAL_MODULE := mylibrary-prebuilt
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libmylibrary.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
include $(PREBUILT_SHARED_LIBRARY)

如果我在这个项目中执行 project->clean... 然后 project->build project 我会收到错误:

ERROR:jni/Android.mk:mylibrary-prebuilt: LOCAL_SRC_FILES 指向丢失的文件。

清理会删除 .so,我猜 PREBUILT_SHARED_LIBRARY 在 BUILD_SHARED_LIBRARY 重建库并复制它之前检测到丢失的 .so(即使这些步骤的顺序正确)。

如果我注释掉第 1 步并构建,libmylibrary.so 会正确构建并复制到 libs/armeabi/libmylibrary.so。如果我随后取消注释第 2 步并执行 project->build project,即没有先进行清理,我会收到以下警告和错误:

warning: overriding commands for target `obj/local/armeabi/libmylibrary.so'
warning: ignoring old commands for target `obj/local/armeabi/libmylibrary.so'
warning: overriding commands for target `libs/armeabi/libmylibrary.so'
warning: ignoring old commands for target `libs/armeabi/libmylibrary.so'

make: *** No rule to make target `jni/../libs/armeabi/libmylibrary.so', needed by `obj/local/armeabi/libmylibrary.so'.  Stop.

我想我理解这些错误,但我没有找到实现我想要的方法。

我错过了什么?

【问题讨论】:

    标签: android-ndk libraries dependency-management


    【解决方案1】:

    您可以完全避免第 1 步,直接从源代码重建库。我不确定我是否理解您描述的三个步骤的好处。欢迎澄清。

    在所有情况下,您对 ndk-build 行为的分析都是准确的,所有这些都是有意为之的。

    NDK 本身提供了几个预构建的库,并允许您根据需要从源代码重建它们。例如,如果您查看 sources/cxx-stl/stlport/Android.mk,您会看到一个变量 (STLPORT_FORCE_REBUILD) 用于控制是使用预构建的二进制文件,还是从源代码重建它们。

    也许对您的项目使用类似的方法会起作用。

    【讨论】:

    • 感谢您的评论。我一直在考虑我的目标,并得出结论它是错误的。我想要第 0 步,因为该库正在开发中。我一直在重建它。所以我可能不想要一个预建库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多