Android 静态库的预生成失败
我尝试基于CMake脚本建立Android NDK构建,动态创建所需的Android make文件。虽然我不能使用JNI文件夹结构,但我将构建过程拆分为几个单独的make脚本: 首先创建位于项目根目录中的根Android.mk文件:Android 静态库的预生成失败,android,android-ndk,cmake,Android,Android Ndk,Cmake,我尝试基于CMake脚本建立Android NDK构建,动态创建所需的Android make文件。虽然我不能使用JNI文件夹结构,但我将构建过程拆分为几个单独的make脚本: 首先创建位于项目根目录中的根Android.mk文件: #ANDROID ROOT MAKEFILE LOCAL_PATH := D:/binrev/repository/bar include $(CLEAR_VARS) MY_LOCAL_CFLAGS := -DDEBUG include D:/binrev/re
#ANDROID ROOT MAKEFILE
LOCAL_PATH := D:/binrev/repository/bar
include $(CLEAR_VARS)
MY_LOCAL_CFLAGS := -DDEBUG
include D:/binrev/repository/bar/src/Android.mk
第二步在项目源文件夹中创建源Android.mk文件并执行模块构建:
$(info "[INFO] Source Makefile invoked")
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include
LOCAL_SRC_FILES := bar.cpp
ifeq (debug,"debug")
MY_LOCAL_CFLAGS := -DDEBUG
endif
ifeq (false,true)
LOCAL_ARM_MODE := arm
endif
LOCAL_EXPORT_C_INCLUDES := D:/binrev/repository/bar/include
LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += -landroid
LOCAL_STATIC_LIBRARIES += foo
ifeq (OFF, ON)
include $(BUILD_SHARED_LIBRARY)
else
include $(BUILD_STATIC_LIBRARY)
endif
基本上,这个机制是有效的,我可以编译我的源代码,但是如果我试图包含一个库的预构建,我就失败了。我尝试了以下方法来包含预构建
静态库(具有修改的源/包含定义)的类型:
源Android.mk文件中的第一个预构建定义
第二次调用导入模块机制并将Prebuild Android.mk文件添加到Prebuild lib
根Android.mk文件中的第三个预构建定义
[编辑:]以下是同样失败的调用导入测试的截图:
$(info“[info]调用的源Makefile”)
在每种情况下,都会调用带有预构建定义的脚本,但预构建
不执行。当我的NDK构建完成后,预构建库和
对象不会复制到我的obj文件夹。在我看来,预构建是
完全被忽视了。但是预构建源代码的路径是正确的,否则
编译失败,文件丢失错误
您可以在此处获得此测试实现的完整源代码:
[测试项目][1]
提示:bar项目是尝试预构建foo项目的项目。
foo项目包含预构建源代码
添加的测试项目可以使用MinGW64和GCC4.7/4.8与CMake握手并使用预装NDK(使用r8e)自行构建
我完全迷失了方向,失去了想法。。。
感谢您的帮助。如果没有共享库的使用,Android构建系统将无法构建静态库。只需创建一个虚拟共享库,将您的静态库作为依赖项,瞧:
include $(CLEAR_VARS)
LOCAL_MODULE := dummy
LOCAL_PATH := $(LOCAL_PATH)
LOCAL_SRC_FILES := dummy.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
为了排除可能的缺陷源,我将Android make文件简化为最简单的情况,而不使用这些文件的CMake生成器:
LOCAL_PATH := D:/binrev/repository/bar
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := external-deps/foo/lib/android/$(TARGET_ARCH_ABI)/libfoo.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include
LOCAL_C_INCLUDES+= D:/binrev/repository/bar/external-deps/foo/include
LOCAL_SRC_FILES := src/bar.cpp
LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += -landroid
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
以及:
失败仍然存在。未执行foo库的预构建。我还排除了MinGW64作为缺陷的可能来源,如果我尝试使用Windows命令行构建项目,它会导致相同的问题。共享库已生成,但未执行预生成
我检查了我的源代码和脚本多次,但没有发现任何失败。
有什么想法可能是错误的或缺少的吗?bar项目是作为引用foo项目的共享库构建的。我已经编辑了源示例并添加了调用模块导入测试的make文件。
include $(CLEAR_VARS)
LOCAL_MODULE := dummy
LOCAL_PATH := $(LOCAL_PATH)
LOCAL_SRC_FILES := dummy.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := D:/binrev/repository/bar
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := external-deps/foo/lib/android/$(TARGET_ARCH_ABI)/libfoo.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_C_INCLUDES:= D:/binrev/repository/bar/include
LOCAL_C_INCLUDES+= D:/binrev/repository/bar/external-deps/foo/include
LOCAL_SRC_FILES := src/bar.cpp
LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += -landroid
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := D:/binrev/repository/foo
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_C_INCLUDES:= D:/binrev/repository/foo/include
LOCAL_SRC_FILES := src/foo.cpp
LOCAL_LDLIBS := -llog
LOCAL_LDLIBS += -landroid
include $(BUILD_STATIC_LIBRARY)