4

我有一个想要编译的 Android JNI 项目ndk-build。该项目包含多个第三方子项目。

+- 杰尼
   +- 安卓.mk
   +- 我的项目.mk
   +- 其他项目.mk
   +- 我的项目
      +- a.cpp
      +- b.cpp
   +- 其他项目(第三方)
      +- c.cpp
      +- d.cpp

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

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.mk或修改other-proj.mk不会触发相应项目的重建。有没有办法做到这一点?

我虽然可以将makefile列为依赖项,Android.mk但我想不出办法。(在下面列出它们LOCAL_SRC_FILES是行不通的。)

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

4

2 回答 2

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.mkother-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最后一行中。

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

NDK_MODULE_PATH := $(LOCAL_PATH)

不起作用。_ (如果NDK_MODULE_PATH要使用,它需要定义为makefile之外的环境变量)。

于 2012-05-10T11:08:20.227 回答
1

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

于 2012-04-27T21:40:40.393 回答