我有一个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.mk
或other-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直接放在子项目目录中,因为它们是第三方项目。)
答案 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)
它可能不是最优雅的方式,但有时我会通过添加额外的空格或换行来修改其中一个来源。这似乎唤醒了编译器。