我是在使用cocos2d-x时遇到的android.mk。据说纯android项目中是没有(不会用到)android.mk文件的,一般是项目中需要调用到C++代码时,才需要用到这个文件。
android.mk文件,在android项目的 jni 文件夹下,在android-studio项目的 app/jni 文件夹下。
android.mk主要用来告诉编译器,需要编译哪些c++文件,以及需要编译的外部库和一些系统库。
这里有一个android.mk文件,是cocos2d-x项目中,android平台项目中 jni 目录下的。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END
LOCAL_STATIC_LIBRARIES := cocos2dx_static
# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END
include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)
# _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END
首先不去看它是在做什么,先了解一下这个语法吧。
LOCAL_PATH := $(call my-dir)
从这一句看(Android.mk文件开头必须是这一句),LOCAL_PATH是一个变量名(LOCAL_开头的变量名被系统保留了,我们不要随便定义),call 相当于调用的意思了,my-dir 是编译系统提的变量,暂且理解为当前.mk文件的目录路径。这一句的意思就是把当前.mk文件的路径赋值给LOCAL_PATH这个变量。
include $(CLEAR_VARS)
从这一句看 include是包含的关键字,CLEAR_VARS是编译器提供的一个脚本。这一句的作用就是引入一个脚本,清楚前面所有用户自定义的变量。
了解了基本的语法,就基本能看懂android.mk文件了。
关于Android.mk文件的基础认识还可以看下面的博客
Android.mk的用法和基础 && m、mm、mmm编译命令(感谢博主)
更详细和全面的解释在这里
Android NDK学习 <一> 简介 和 Android NDK学习 <二> Android.mk的制作 (感谢博主)
了解了一下如何去配置c++源文件之后,可以继续往后面看。
我们往往在项目中还会用到很多第三方库,以及系统库(部分系统库在Android NDK学习 <一> 简介有介绍到)。
这边大神的教程很详细 Android NDK学习 <三> Android.mk实例和NDK实用技巧(感谢博主)
按以上教程,配置好Android.mk文件,项目就是可以运行的。但是每次新建一个项目,或者添加了一些c++文件,就需要来配置Android.mk 确实有些麻烦。
然后我们可以使用下面这种方式来自动添加源文件
define all-cpp-files
$(patsubst jni/%,%, $(shell find $(LOCAL_PATH)/../../../Classes/ $(LOCAL_PATH)/hellocpp -name "*.cpp"))
endef
define all-c-files
$(patsubst jni/%,%, $(shell find $(LOCAL_PATH)/../../../Classes/ $(LOCAL_PATH)/hellocpp -name "*.c"))
endef
# 这里使用新的方式替换换来的方式,以自动添加源文件
LOCAL_SRC_FILES := $(call all-cpp-files) \
$(call all-c-files)
上面也是定义了两个类似函数的东西,在填写c++源文件的时候,不直接去写每个源文件的文件路径。而是通过调用上方的脚本来自动查找源文件,酱紫就不需要每次都来修改makefile了。
写法可以看到下面教程
解决 Cocos2d-x 中 Android.mk 手动添加源文件(感谢博主)
以及上面脚本中用到的 patsubst 的解释
makefile里的wildcard和patsubst(感谢博主)
如果我们编写的Android.mk文件内容比较多,可能需要进行调试。此时可以在Android.mk中输出调试信息。
Android.mk中输出打印信息(感谢博主)
基本就是酱紫了