关于android.mk文件的作用、语法和自动添加源文件的学习

我是在使用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中输出打印信息(感谢博主)


基本就是酱紫了


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值