二、Android.mk语法详解
我们还是采用的开发板来学习.mk
NOTED: 在编译之前,我们需要 & lunch
build/.sh
lunch -
或者lunch后选择41
一、.mk介绍
.mk是提供的一种文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练掌握.mk的语法规范。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
................
LOCAL_xxx := xxx
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_xxx := xxx
................
include $(BUILD_SHARED_LIBRARY)
变量制定了该.mk的路径,$(call my-dir)调用NDK内部的函数获得当前.mk文件的路径
$()清空了除了之外的所有变量的值
省略号中间就是对于模块参数的设置,主要包括:模块名字、模块源文件、模块类型、编译好的模块存放位置、以及编译的平台等
$()执行NDK的默认脚本,它会收集 $()脚本后所有定义的变量,然后根据它们来生成模块。
二、.mk语法详解
:= $(call my-dir)
每个.mk文件必须以定义为开始。它用于在开发tree中查找源文件。宏my-dir 则由Build 提供。返回包含.mk的目录路径。
$()
变量由Build 提供。并指向一个指定的GNU ,由它负责清理很多.
例如:, , ES等等。但不清理.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
:= hello-jni
模块必须定义,以表示.mk中的每一个模块。名字必须唯一且不包含空格。Build 会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成.so. 但请注意:如果模块名被定为:.则生成.so. 不再加前缀
:=$() 指定最后生成的模块的目标地址
:根文件系统,路径为out////root
:文件系统,路径为out////
:data文件系统,路径为out////data
除了上面的这些,NDK还提供了很多其他的变量,用于将生成的模块拷贝到输出目录的不同路径,默认是
:= hello-jni.c
变量必须包含将要打包如模块的C/C++ 源码。不必列出头文件,build 会自动帮我们找出依赖文件。缺省的C++源码的扩展名为.cpp. 也可以修改,通过
$()
:是Build 提供的一个变量,指向一个GNU 。
它负责收集自从上次调用 $() 后的所有信息。并决定编译为什么。
:编译为静态库。
:编译为动态库
:编译为 C可执行程序
:该模块已经预先编译
NDK还定义了很多其他的变量,它们用来指定模块的生成方式。
三. .mk实战 1.编译静态库
首先我们把下创建一个Study的目录,然后再Study创建一个test1的目录,tree如下:
我们的目标是把test.c编译成一个静态库
test.c代码如下:
#include int test(void)
{printf("hello Androoid.mk\r\n");return 0;
}
.mk代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := test.c
LOCAL_MODULE := test1
include $(BUILD_STATIC_LIBRARY)
编译方法:
方法1:在 跟目录下敲指令:make test1
方法2:在/Study/test1目录下敲指令mm
注意:两个方法都需要先 build/.sh -> lunch选择41
test.a生成在out///////test1.a
NOTED:我们发现生成的并不是.a,而是test1.a,这个要注意下
2.编译动态库
首先我们把下创建一个Study的目录,然后再Study创建一个test2的目录,tree如下:
我们的目标是把test.c编译成一个静态库
test.c代码如下:
#include int test(void)
{printf("hello Androoid.mk\r\n");return 0;
}
.mk代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := test.c
LOCAL_MODULE := test2
include $(BUILD_SHARED_LIBRARY)
编译方法:
方法1:在 跟目录下敲指令:make test2
方法2:在/Study/test2目录下敲指令mm
注意:两个方法都需要先 build/.sh -> lunch选择41
test.so生成在out///////test2.so
NOTED:我们发现生成的并不是.so,而是test2.so,这个要注意下