NDK编译使用到Application.mk和Android.mk两个脚本
Application.mk用于配置项目的全局选项,如果项目适配的cpuAbi,安卓的platform版本等
Android.mk则用于配置具体的代码编译规则
mk文件语法的详细介绍,可以参考谷歌的官方文档
https://developer.android.google.cn/ndk/guides/application_mk
这里简单示范下,常用的Android.mk语法规则
#这并不是一个有效的Makefile文件,仅仅是为了演示Makefile语法
#纯手动输入,可能会有单词拼写错误,仅供学习,不要照抄
#Android.mk是在make程序基础上定义的一种脚本,它能被make程序识别并执行
#Android.mk支持将若干源文件分组为一个模块,一个模块可以作为整体被其它脚本方法使用
#Android.mk会自动计算头文件依赖关系,不需要手动引入头文件
#指定工作目录
#后面其它的路径,都是相对于LOCAL_PATH的路径
LOCAL_PATH := $(call my-dir)
#引入已经编译好的so文件
#清理LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES等变量值
#但不会清理LOCAL_PATH变量
include $(CLEAR_VARS)
#定义模块名
LOCAL_MODULE := test
#指定该模块包含的源码文件
LOCAL_SRC_FILES := libtest.a
#引入预先编译好的静态库,即a文件
include $(PREBUILT_STATIC_LIBRARY)
#CLEAR_VARS,PREBUILT_SHARED_LIBRARY这些都是Makefile内置的脚本名称
#通过【include $(xxx)】格式的语法,可以执行这些脚本
#PREBUILT_SHARED_LIBRARY 引入预编译的静态库,即so文件
#安卓6.0以上的系统已经不支持引用一个so库,生成另一个so库,强行使用,编译出来的so库会运行异常
#PREBUILT_STATIC_LIBRARY 引入预编译的静态库,即a文件
#BUILD_STATIC_LIBRARY 构建生成静态库
#BUILD_SHARED_LIBRARY 构建生成动态库
#BUILD_EXECUTABLE 构建生成可执行文件 文件格式取决于操作系统
#依赖预编译好的静态库,生成新的so库
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_MODULE_FILENAME := libHelloJni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_STATIC_LIBRARIES := test
include $(BUILD_SHARED_LIBRARY)
#LOCAL_MODULE_FILENAME 指定so库名称,也可不指定,会使用默认命名规则
#LOCAL_SRC_FILES 引入源文件
#LOCAL_C_INCLUDES 引入头文件,指定头文件查找目录
#LOCAL_STATIC_LIBRARIES 引入静态库,后面接的必须是模块名,不能使用文件路径,模块名可能定义在其它mk文件里
#如果【BUILD_SHARED_LIBRARY】依赖了另一个动态库模块的话,在使用时,两个so库文件都需要放进项目,因为它的实质是在运行时去查找其它被引用的so文件
#如果【BUILD_SHARED_LIBRARY】依赖的是静态库模块,只需要将最终的so文件放进项目即可,因为它的实质是将a文件中被用到的函数打包进so库里面
#【BUILD_SHARED_LIBRARY】在依赖静态库时,不会将没被使用到的代码打包到so库里面,所以最终打包生成的文件体积比较小
#引入其它目录下的Android.mk文件
#寻找所有【add-path】目录,如果某个目录下存在cocos目录,并且该目录下有Android.mk文件,则引入
$(call import-add-path, $(LOCAL_PATH)/../../cocos2d)
$(call import-add-path, $(LOCAL_PATH)/../../cocos2d/external)
$(call import-module, cocos)