我试图弄清楚如何设置一个Android.mk依赖于另一个。后者构建原生代码共享库,前者有依赖共享库的JNI库。我们称它们为shared_liband service。
现在,Android.mkforservice包含如下代码:
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 路径扩展中有如此多的魔力,以至于我永远无法预测会发生什么。例如,将此代码添加到 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.
看起来像是import-add-path在弄乱变量,从而导致在错误的位置搜索 C++ 源文件。但是import-module没有它就失败了。
此外,如果您先运行,则在ndk-build clean目录中运行会service失败并出现错误。由于该文件被列为本地源文件,因此它不存在是错误的。ndk-build cleanshared_lib.so
ndk-build构建在 之上make,并且有一个单一的全局命名空间,而我为构建另一个make所做的一切尝试都遇到了这样的问题。最好的方法似乎是显式调用以获取一个新的实例,从而获得一个单独的命名空间。Android.mkAndroid.mkndk-buildmake
有什么方法可以设置,以便ndk-build首先service构建shared_lib?如果上述ndk-build clean情况也正常工作,则加分。