Android-ndk中的.mk文件语法规则

Android.mk
-------------------------------------------------------------------------
LOCAL_PATH := $(call my-dir)   #当前路径类似于php中的 __FILE__

include $(CLEAR_VARS)           #清楚上次遗留的一些垃圾变量

                                   #类似于php中的 include_once('CLEAR_VARS.PHP');

LOCAL_MODULE    := hello-jni     #该动态链接库模块的名称
LOCAL_SRC_FILES := hello-jni.c   #需要编译的c源码

include $(BUILD_SHARED_LIBRARY)    #包含编译所需的核心库文件

                                   #类似于php中的 include('BUILD_SHARED_LIBRARY.php');

Application.mk
----------------------------------------------------------------------------
#翻译 $(call my-dir) 当前路径的意思,也就是说这个脚本所在的路径
APP_PROJECT_PATH := $(call my-dir)/project    #该应用程序的位置,主要是用于将生成的.so放在该工程的libs/arbeabi/下
APP_MODULES      := hello-jni                #该模块的名称 和Android.mk中写的要一样

out目录说明
-----------------------------------------------------------------------------
host这个文件时必须的,不能删除掉。
apps可以删除掉,这个文件夹是专门用来存放编译源码时产生的临时文件的地方。如果再次生成.so
文件出错可以清楚apps这个目录来达到清理缓存目的。但是我个人认为这个apps文件夹可以在下个版本中
移除,因为程序员可以不必关心这个垃圾中转站。但是想了解编译过程这个是必不可少的。

因为.mk相当于shell或者是php,所以就成他们为脚本吧。

关于mk脚本的注意事项:
1.所有的.mk文件必须是以ansi编码,否则会提示找不到某个变量
2.如果注释和脚本是一行的 是以#开头(注意中文和英文的区别) 之间不能有任何的空格
  比如: 可以是LOCAL_PATH := $(call my-dir)#测试下LOCAL_PATH,不能是 LOCAL_PATH := $(call my-dir)   #测试下LOCAL_PATH
3.用中文注释的时候中文的#和英文的#都是一样的,这个比较好。
4.编译器内部有个mk脚本版本的hash算法,来区别该脚本是不是有更新过,就像我们开发android应用程序一样(需要有修改才能运行
在模拟器上,否则会提示已经运行到前台),如果所有的.mk脚本没有被修改过,你再次运行make APP=XXX的时候会提示你Nothing To Be Done!
因为两次的hash值是一样的,说明没被改过,不会重复运行。



原文地址:https://www.cnblogs.com/Anzhongliu/p/6092026.html