我在命令行用 NDK 编译静态库的时候遇到奇怪的问题:NDK 根本就没有执行编译。Android.mk 文件如下:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= add.c
LOCAL_MODULE:=libadd
LOCAL_PRELINK_MODULE := false
include $(BUILD_STATIC_LIBRARY)
如果换成动态库(即将 BUILD_STATIC_LIBRARY 改为 BUILD_SHARED_LIBRARY),则会正常生成动态库。
如果同时编译可执行文件,则也能执行编译,但编译生成的只有可执行文件,而没有独立的静态库。编译可执行文件的Android.mk 文件如下:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= add.c
LOCAL_MODULE:=libadd
LOCAL_PRELINK_MODULE := false
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=test.c
LOCAL_MODULE:=test
LOCAL_STATIC_LIBRARIES:=libadd
include $(BUILD_EXECUTABLE)
后来经过分析才搞清楚是因为 NDK r6 默认不支持静态库的 install 操作。因此可以将 definitions.mk 脚本里的
module-class-is-installable = $(if $(NDK_MODULE_CLASS.$1.INSTALLABLE),$(true),$(false))
修改为:
module-class-is-installable = $(if $(NDK_MODULE_CLASS.$1.INSTALLABLE),$(true),$(true))
这样强制 NDK 对静态库进行 install,即可单独生成静态库。