【发布时间】:2013-09-25 19:59:10
【问题描述】:
我想弄清楚如何设置一个Android.mk 以依赖另一个。后者构建原生代码共享库,前者有依赖共享库的JNI库。我们称它们为shared_lib 和service。
现在,service 的 Android.mk 包含如下代码:
LOCAL_SRC_FILES := ../../../shared_lib/libs/armeabi/libshared_NDK.so
include $(PREBUILT_SHARED_LIBRARY)
这可行,但前提是 shared_lib 已经构建。构建 service 不会构建 shared_lib。
我编写了一个 shell 脚本,它首先构建 shared_lib,然后构建 service。但似乎应该可以使用构建系统来完成构建任务。
我尝试使用$(call import-module,...),但没有找到任何有效的语法。 makefile 路径扩展中有如此多的魔力,以至于我永远无法预测会发生什么。例如,将此代码添加到 service 的 Android.mk 中:
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.
看起来import-add-path 弄乱了变量,从而导致在错误的位置搜索 C++ 源文件。但是import-module 没有它就失败了。
此外,如果您先在 shared_lib 上运行 ndk-build clean,则在 service 的目录中运行 ndk-build clean 会失败并出现错误。由于.so 文件被列为本地源文件,因此它不存在是错误的。
ndk-build 建立在make 之上,而make 有一个单一的全局命名空间,而我为使一个Android.mk 构建另一个Android.mk 所做的一切都遇到了这样的问题。最好的方法似乎是显式调用ndk-build 以获取make 的新实例,从而获得一个单独的命名空间。
有什么方法可以让ndk-build 在service 上首先构建shared_lib?如果上述ndk-build clean 案例也能正常工作,则加分。
【问题讨论】:
标签: android android-ndk ndk-build