如何使“ndk-build clean”继续出错

时间:2013-12-16 16:29:28

标签: android android-ndk java-native-interface ndk-build

我有一个包含多个项目的大型源代码树。其中一个项目使用JNI。

当我尝试在整个源代码树上“清理”时,它会遍历并删除所有目标文件和库。然后它进入我的应用程序目录以进行清理。

当它到达我的JNI项目时,它执行“ndk-build clean”失败,因为我链接的库已被删除作为清理的一部分:

ndk-build clean
Android NDK: ERROR:/Users/spartygw/xyz/src/applications/foo/jni/Android.mk:bar: LOCAL_SRC_FILES points to a missing file    
Android NDK: Check that /Users/spartygw/xyz/src/applications/foo/jni/../../../../lib/libbar.a exists or that its path is correct   
/Users/spartygw/android-ndk-r6b/build/core/prebuilt-library.mk:43: *** Android NDK: Aborting    .  Stop.
make[3]: *** [clean_android] Error 2
make[2]: *** [clean] Error 2
make[1]: *** [clean] Error 2
make: *** [clean] Error 2

我尝试添加“ndk-build -k clean”和“ndk-build --ignore clean”,但无论如何都会挽救。

如何让ndk-build忽略对尚未构建的库的依赖,只清理本地对象?

2 个答案:

答案 0 :(得分:5)

您的 ndk-buid 包含预装静态库,即使在干净的构建中也不应该消失。有一些非标准步骤构建 libbar.a 并将其复制到../../../../lib/

如果您有充分的理由不直接从其构建的地方(…/obj/local/armeabi)链接到libbar.a,那么您有两个选择:include $(PREBUILT_STATIC_LIBRARY)有条件地,如果它的$ (LOCAL_SRC_FILES)存在,或清洁不是目标。

按照前一种方法的简单概述:

include $(CLEAR_VARS)
LOCAL_MODULE = bar
LOCAL_PATH := ../../../../lib
LOCAL_SRC_FILES := libbar.a
ifneq (,$(wildcard $(LOCAL_PATH)/$(LOCAL_SRC_FILES)))
  include $(PREBUILT_STATIC_LIBRARY)
endif

答案 1 :(得分:0)

正如Alex的回答所示,你也可以使用ifneq ($(MAKECMDGOALS),clean)检查当前目标是否清洁

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := bar.so
LOCAL_EXPORT_C_INCLUDES := bar/location
# Avoid including on clean
ifneq ($(MAKECMDGOALS),clean)
    include $(PREBUILT_SHARED_LIBRARY)
endif