对导入的makefile的更改不会在android-ndk中触发重建

时间:2012-04-25 16:12:28

标签: android android-ndk makefile android-ndk-r7

我有一个Android JNI项目,我想用ndk-build进行编译。该项目包含多个第三方子项目。

+- jni
   +- Android.mk
   +- my-proj.mk
   +- other-proj.mk
   +- my-proj
      +- a.cpp
      +- b.cpp
   +- other-proj  (third-party)
      +- c.cpp
      +- d.cpp

现在的想法是在Android.mk中包含/导入所有子项目的makefile,如下所示:

LOCAL_PATH := $(call my-dir)

include $(LOCAL_PATH)/my-proj.mk
include $(LOCAL_PATH)/other-proj.mk

other-proj构建为静态库。 my-proj.mk取决于other-proj,并构建为共享库。

构建此项目有效。 但是,修改my-proj.mkother-proj.mk并不会触发相应项目的重建。有没有办法做到这一点?

我虽然可以将makefile列为Android.mk的依赖项,但我无法找到方法。 (在LOCAL_SRC_FILES下列出它们并不起作用。)

我还读到了$(call import-module,foo/bar)这似乎完全符合我的要求。但是,在这种情况下,我必须将makefile放在邻近目录中的项目目录中(例如jni/makefiles/other-proj/Android.mk),但我无法弄清楚如何指定{{1 }}。他们似乎不喜欢用绝对路径或路径中的LOCAL_SRC_FILES来指定。 (我不能将makefile直接放在子项目目录中,因为它们是第三方项目。)

2 个答案:

答案 0 :(得分:2)

我找到了一种方法,虽然不是简单的包含,而是使用$(call import-module,foo/bar)

首先,您需要确定其中一个子项目是主项目。我们为此采取my-proj。然后目录结构改变如下:

+- jni
   +- Android.mk
   +- my-proj
      +- a.cpp
      +- b.cpp
   +- other-proj  (third-party)
      +- Android.mk
      +- c.cpp
      +- d.cpp

基本上我将my-proj.mk重命名为/Android.mk,将other-proj.mk重命名为other-proj/Android.mk

然后主Android.mk更改为以下内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
...
LOCAL_STATIC_LIBRARIES := other-proj
include $(BUILD_SHARED_LIBRARY)

$(call import-add-path,$(LOCAL_PATH))
$(call import-module,other-proj)

other-proj包含在最后一行中。

请注意,最后一行之前的行设置模块路径。通过

在生成文件中设置模块路径
NDK_MODULE_PATH := $(LOCAL_PATH)

工作。 (如果要使用NDK_MODULE_PATH,则需要将其定义为makefile之外的环境变量。)

答案 1 :(得分:1)

它可能不是最优雅的方式,但有时我会通过添加额外的空格或换行来修改其中一个来源。这似乎唤醒了编译器。