如何设置Android.mk以执行嵌套构建

时间:2013-09-25 19:59:10

标签: android android-ndk ndk-build

我想弄清楚如何设置一个Android.mk来依赖另一个。后者构建了本机代码共享库,前者具有依赖于共享库的JNI库。我们称这些为shared_libservice

目前,Android.mk的{​​{1}}包含以下代码:

service

这样可行,但仅在已构建LOCAL_SRC_FILES := ../../../shared_lib/libs/armeabi/libshared_NDK.so include $(PREBUILT_SHARED_LIBRARY) 时才有效。构建shared_lib不会构建service

我写了一个shell脚本,首先构建shared_lib,然后构建shared_lib。但似乎应该可以使用构建系统来执行构建任务。

我曾尝试使用service,但未找到任何有效的语法。 makefile路径扩展中有太多魔力,我无法预测会发生什么。例如,将此代码添加到$(call import-module,...)的Android.mk中:

service

这根本不起作用;我得到了这个错误结果:

include $(CLEAR_VARS)
SL_DIR=$(LOCAL_PATH)/../../../shared_lib
$(call import-add-path,$(SL_DIR))
NDK_MODULE_PATH := $(SL_DIR)
$(call import-module, jni)

看起来/Users/steveha/devel/android/ndk/build/core/build-binary.mk:450: warning: overriding commands for target `obj/local/armeabi/libshared_NDK.so' /Users/steveha/devel/android/ndk/build/core/build-binary.mk:473: warning: ignoring old commands for target `obj/local/armeabi/libshared_NDK.so' /Users/steveha/devel/android/ndk/build/core/build-binary.mk:489: warning: overriding commands for target `libs/armeabi/libshared_NDK.so' /Users/steveha/devel/android/ndk/build/core/build-binary.mk:489: warning: ignoring old commands for target `libs/armeabi/libshared_NDK.so' make: *** No rule to make target `../../shared_library/jni/com_dts_SourceFile.cpp', needed by `obj/local/armeabi/objs/dts-shared-jni/com_dts_shared_SourceFile.o'. Stop. 搞乱了变量,从而导致在错误的地方搜索C ++源文件。但import-add-path没有它就会失败。

此外,如果您首先在import-module上运行ndk-build clean,则在service目录中运行ndk-build clean会失败并显示错误。由于shared_lib文件被列为本地源文件,因此它不存在是错误的。

.so建立在ndk-build之上,make有一个全局命名空间,我尝试过使make构建另一个Android.mk Android.mk有这样的问题。最好的方法似乎是显式调用ndk-build来获取make的新实例,从而获得一个单独的命名空间。

有没有办法进行设置,以便ndk-buildservice首先构建shared_lib?如果上述ndk-build clean案例也能正常运作,则可获得奖励积分。

1 个答案:

答案 0 :(得分:0)

我从未找到纯粹的" make"解。相反,我编写了一个Python脚本来依次构建每个模块。在自己的进程中运行每个ndk-build非常简单而且健壮。