【发布时间】:2014-03-27 17:07:06
【问题描述】:
我已经阅读了很多关于如何使用 Android.mk 系统共享预建库的帖子。解决方案归结为两个步骤:
- 包含已构建库的目录使用 *include $(PREBUILT_SHARED_LIBRARY)*
- 使用该库的项目使用 *LOCAL_SHARED_LIBRARIES*
(您可以将“STATIC”替换为“SHARED”来构建和使用 .a 而不是 .so)
我想要做的是添加第 0 步:从源代码构建库。如果我更改了对库有贡献的源文件,我希望 Android.mk 系统按顺序执行步骤 0、1 和 2。
我在 Eclipse/ADT 中有两个项目:
- MyApp - 使用 MyLibrary
- 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