我的具体问题是我需要在一个具有一个共享库(JNI 接口)和两个静态库的项目中使用 Android 'cpufeatures' 库(在 NDK 的 docs/CPU-FEATURES.html 中描述)。
共享库不直接使用 cpufeatures 库,而是在其中一个静态库中使用。
cpufeatures 是一个 Android 的“导入模块”。导入模块的使用相当简单,只需要以下步骤(来自 NDK r8e 版本的 CPU-FEATURES.html):
在静态库依赖项列表中列出“cpufeatures”,如下所示:
LOCAL_STATIC_LIBRARIES := cpufeatures
在您的 Android.mk 末尾,导入“android/cpufeatures”模块,如下所示:
$(call import-module,android/cpufeatures)
在您的源代码中,包含名为
但是,如果我将 cpufeatures 添加到主库的 LOCAL_STATIC_LIBRARIES 中,则 cpufeatures 的包含路径仅在构建主库时可用,而不是在构建静态库时可用,因此编译失败。
cpufeature 的 Android.mk 的内容和这个相关的答案一起建议应该可以改为将 LOCAL_STATIC_LIBRARIES 添加到共享库本身,如下所示:
...
include $(CLEAR_VARS)
LOCAL_MODULE := CommonClasses
LOCAL_CFLAGS := $(MY_CFLAGS)
LOCAL_C_INCLUDES += $(MY_COMMON_C_INCLUDES)
LOCAL_STATIC_LIBRARIES := cpufeatures
LOCAL_SRC_FILES := \
$(wildcard $(MY_COMMON_CLASSES_SRC_PATH)/*.cpp) \
...
$(wildcard $(MY_COMMON_CLASSES_SRC_PATH)/sound/*.cpp)
include $(BUILD_STATIC_LIBRARY)
...
$(call import-module,android/cpufeatures)
而且,确实,这行得通,我现在可以像这样在作为静态库的一部分编译的源文件中包含库的标头:
#include <cpu-features.h>
我问的原因是,将一个静态库与另一个静态库链接起来毫无意义。但是,LOCAL_STATIC_LIBRARIES 的语义似乎更抽象。
这是正确的方法吗,即我可以期望它继续工作并且以后不会引起我意想不到的不满吗?