为了之后再次查阅的方便,根据两位前辈的经验将其整合到了一起,之后可能也会修改,在此注明本文根据以下两处的文章进行改编,如有侵权等地方请联系本人。
根据这两篇进行学习和总结的:https://blog.youkuaiyun.com/qq_31387043/article/details/50899589
和https://www.jianshu.com/p/c2c23690818f
NDK MakeFile介绍
NDK中的MakeFile有Application.mk和Android.mk两个文件组成。
Application.mk是对整个项目的全局性描述,比如编译的平台,编译的优化选项等;
Android.mk是项目中某一个模块的编译脚本,在其中指定Module的名称,需要编译的代码文件,以及需要包含的头文件等。
Application.mk
APP_ABI
指明编译与调试的CPU架构。以下是列出的常用的几种:
CPU架构 | ABI | |
ARMv5 | armeabi | 32位,从2010年 |
ARMv7 | armeabi-v7a | 32位,从2010年 |
x86 | x86 | 32位,从2011年 |
MIPS | mips | 32位,从2012年 |
ARMv8 | arm64-v8a | 64位,从2014年 |
MIPS64 | mips64 | 64位,从2014年 |
x86_64 | x86_64 | 64位,从2014年 |
APP_PROJECT_PATH
指定项目的路径,一般我们的项目是放在jni目录下的,可以不用指定。
APP_BUILD_SCRIPT
指定NDK编译脚本的文件名称,如果编译脚本名称为Android.mk, 可以不用指定。
Android.mk
LOCAL_PATH := $(call my-dir)
设置当前的代码路径,LOCAL_PATH指向Android.mk所在的目录
include $(CLEAR_VARS)
清除LOCAL_xxx指定的变量,清理后才能避免多个模块相互影响
LOCAL_MODULE := test
指定当前模块的名称为test,生成后的文件为libtest.so
LOCAL_SRC_FILES := test.c
指定需要编译的源码文件,不需要列出头文件。网友写的LOCAL_SRC_FILES的技巧:https://blog.youkuaiyun.com/qq_17387361/article/details/52698519
include $(BUILD_SHARED_LIBRARY)
编译生成动态链接库
include $(CLEAR_VARS)
用于重置除LOCAL_PATH变量外的,所有LOCAL_XXX系列变量。
LOCAL_LDLIBS := -Lxxx -la -lb
设置需要链接的动态库,a和b是库名字 xxx是库所在的路径
LOCAL_EXPORT_LDLIBS := -lz
导出模块依赖关系
LOCAL_SHARED_LIBRARIES:=module_name #指定动态库
LOCAL_STATIC_LIBRARIES:=module_name #指定静态库
LOCAL_C_INCLUDES
设置头文件搜索路径
OCAL_CFLAGS += -DXXX
相当于在所有源文件中增加一个宏定义#define XXX
LOCAL_LDFLAGS
这个编译变量传递给链接器一个一些额外的参数,比如想传递而外的库和库路径给ld,或者传递给ld linker的一些链接参数
LOCAL_PRELINK_MODULE := false
变量设置为false那么将不做prelink操作
LOCAL_MODULE_TAGS := optional
指该模块在所有版本下都编译
LOCAL_MODULE_TAGS的参数说明:
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
include $(BUILD_xxx_xxx)
执行NDK的默认脚本