android NDK的android.mk文件的详解
2015-11-30 17:41
387 查看
1 LOCAL_PATH必须位于Android.mk文件的最开始。它是用来定位源文件的位置,$(call
my-dir)的作用就是返回当前目录的路径。
include$(CLEAR_VARS)的作用是清除一些变量的值,但是LOCAL_PATH除外。
LOCAL_MODULE是用来指定当前待编译模块的名称,在示例中的模块名称为hello-jni
LOCAL_SRC_FILES是用来指定参与编译的源代码文件。这里只编译hell0-jin.c
include$(BUILD_SHARED_LIBRARY)是用来指示将当前模块编译为共享库,前缀为lib,后缀为.so。
还有另外一个BUILD_STATIC_LIBRARY,是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。
这就是一个最简单的Android.mk的结构。可能还有另外一点需要介绍:
2、定义多个Android.mk文件。
有的时候,需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录中,这样,我们可以在每个目录中定义对应的Android.mk文件(类似于上面的写法),最后,在根目录放置一个Android.mk文件,内容如下:
include$(call all-subdir-makefiles)
只需要这一行就可以了,它的作用就是包含所有子目录中的Android.mk文件
3、也可以在一个Android.mk文件里包含多个模块。
很直观的想法就是将第一个Android.mk文件的内容复制一份,然后修改。我最开始也是这样做的,但是后来出现问题了,在第二个模块中的源码找不到,最后还是看文档,发现里面已经有示例解释了:
LOCAL_PATH := $(call my-dir)
IMPORTANTNOTE: Due to the way GNU Make works, this really returns
the path of the *last* *included* *Makefile* during theparsing of
build scripts. Do not call my-dir after including anotherfile.
大意是:基于GNU make的工作方式,$(call my-dir)会返回在解析build脚本时,遇到的最后一个
include中涉及的目录。
所以,很多时候,在这个Android.mk里面只需要调用一次$(call my-dir)就够了,如果所有的源文件都在一个目录中。
如果需要的话,可以在第一次调用call my-dir的时候,将值保存下来,比如:
MY_LOCAL_PATH :=$(call my-dir)
LOCAL_PATH :=$(MY_LOCAL_PATH)
然后,在另外一个模块中,继续如下定义:
LOCAL_PATH:= $(MY_LOCAL_PATH)
4,有时候我们需要引入第三方库文件,就需要配置
LOCAL_CFLAGS :=/
-I/home/xuxin/mylib/android-platform_external_libpcap/jni
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lpcap-L/home/xuxin/mylib/android-platform_external_libpcap/libs/armeabi
这两个变量,LOCAL_CFLAGS :=
主要是引用外部的C头文件, -I
是头文件的存放路径,如果该头文件和我们自己的源文件放在同一级目录,则不需要配置;
LOCAL_LDLIBS :=
是引用外部库文件,-L是指定该lib文件的存放路径。
my-dir)的作用就是返回当前目录的路径。
include$(CLEAR_VARS)的作用是清除一些变量的值,但是LOCAL_PATH除外。
LOCAL_MODULE是用来指定当前待编译模块的名称,在示例中的模块名称为hello-jni
LOCAL_SRC_FILES是用来指定参与编译的源代码文件。这里只编译hell0-jin.c
include$(BUILD_SHARED_LIBRARY)是用来指示将当前模块编译为共享库,前缀为lib,后缀为.so。
还有另外一个BUILD_STATIC_LIBRARY,是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。
这就是一个最简单的Android.mk的结构。可能还有另外一点需要介绍:
2、定义多个Android.mk文件。
有的时候,需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录中,这样,我们可以在每个目录中定义对应的Android.mk文件(类似于上面的写法),最后,在根目录放置一个Android.mk文件,内容如下:
include$(call all-subdir-makefiles)
只需要这一行就可以了,它的作用就是包含所有子目录中的Android.mk文件
3、也可以在一个Android.mk文件里包含多个模块。
很直观的想法就是将第一个Android.mk文件的内容复制一份,然后修改。我最开始也是这样做的,但是后来出现问题了,在第二个模块中的源码找不到,最后还是看文档,发现里面已经有示例解释了:
LOCAL_PATH := $(call my-dir)
IMPORTANTNOTE: Due to the way GNU Make works, this really returns
the path of the *last* *included* *Makefile* during theparsing of
build scripts. Do not call my-dir after including anotherfile.
大意是:基于GNU make的工作方式,$(call my-dir)会返回在解析build脚本时,遇到的最后一个
include中涉及的目录。
所以,很多时候,在这个Android.mk里面只需要调用一次$(call my-dir)就够了,如果所有的源文件都在一个目录中。
如果需要的话,可以在第一次调用call my-dir的时候,将值保存下来,比如:
MY_LOCAL_PATH :=$(call my-dir)
LOCAL_PATH :=$(MY_LOCAL_PATH)
然后,在另外一个模块中,继续如下定义:
LOCAL_PATH:= $(MY_LOCAL_PATH)
4,有时候我们需要引入第三方库文件,就需要配置
LOCAL_CFLAGS :=/
-I/home/xuxin/mylib/android-platform_external_libpcap/jni
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lpcap-L/home/xuxin/mylib/android-platform_external_libpcap/libs/armeabi
这两个变量,LOCAL_CFLAGS :=
主要是引用外部的C头文件, -I
是头文件的存放路径,如果该头文件和我们自己的源文件放在同一级目录,则不需要配置;
LOCAL_LDLIBS :=
是引用外部库文件,-L是指定该lib文件的存放路径。
相关文章推荐
- Android 坑
- android加固系列—1.如何检验so文件是否加壳成功
- AndroidManifest.xml配置文件详解
- [Android]Android Studio比较常用的快捷键(部分)
- android 为什么不建议使用Thread.stop()
- Android_自定义标签换行
- [转]Android Binder设计与实现
- Android Design Support Library: 学习CoordinatorLayout
- android的logcat的message有字符长度的限制,超过将直接截断
- Android动画机制学习---animator(二)
- 基于Ubuntu 15.04 LTS编译Android5.1.0源代码
- Android中View和ViewGroup的measure和layout过程分析
- Android 系统名字、版本、API level的对应关系
- Android SDK开发范例大全学习笔记——3.1更改宇显示文字标签
- android局域网通信(二)
- android中关于SD卡的常用操作函数
- Android AutoLayout全新的适配方式 堪称适配终结者
- Space View
- Android ORMLite 框架的入门用法
- The following classes could not be instantiated