详解android.mk-2016.01.18
1 Android.mk作用
当使用JNI开发时,我们需要创建一个native工程,Android.mk就是一个makefile的配置文件,帮助我们把编写的C/C++代码编译成动态或者静态的链接库。
2 示例解析
下面使用一个最简单的Android.mk配置文件引导生成.so动态库。Android.mk文件内容如下:
LOCAL_PATH := $(call my-dir)
LOCAL_CPP_EXTENSION := .cpp
include $(CLEAR_VARS)
LOCAL_MODULE := jni_demo
LOCAL_SRC_FILES := jni_demo.cpp
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)
第一行: LOCAL_PATH变量用来查找C/C++源文件,my-dir是一个由编译系统提供的宏函数,用于返回Androi.mk文件所在的目录的路径。call函数与GNU makefile中函数意义相同,具体用法可以参见陈皓“跟我一起学Makefile”中的用法。$()是一个引用变量操作符。综上所述,第一行的含义就是,先调用宏函数“my-dir”获取Android.mk文件所在目录路径,然后将Android.mk文件所在路径赋值给LOCAL_PATH变量。
第二行: LOCAL_CPP_EXTENSION变量指定源码文件扩展名
第三行: CLEAR_VARS定义在${NDK_TOOL_PATH}\build\core路径下的build-all.mk文件中,其中NDK_TOOL_PATH指ndk安装根目录。CLEAR_VARS := $(BUILD_SYSTEM)/clear-vars.mk,打开clear-vars.mk文件,查看其注释可知,该mk文件主要用于清除模块内部变量内容,但不会清除LOCAL_PATH的内容。另外,CLEAR_VARS在每个模块文件中应该重复调用。
第四行: LOCAL_MODULE必须定义,文件名必须唯一,而且不能包含空格,另外,编译器可能会添加一些前缀和后缀,来保证文件是一致的,其作用用来指定编译后的模块名称,如上所示,上述的mk文件编译出来的动态库名称将为libjni_demo.so
第五行: 指定编译的源文件,并且文件名都是相对于LOCAL_PATH目录的。多个文件之间可以使用空格或者Tab键分割,可以使用“\”续行。如果追加源代码文件的话,使用“LOCAL_SRC_FILES +=”。关于源码文件编写列表可以参考“编写Android.mk中的LOCAL_SRC_FILES的终极技巧”
第六行: 指定该模块依赖的其他库。-L指定库的路径,-l指定库的名称。
第七行: 执行编译动态库命令,编译动态库。其他可以执行命令:
BUILD_SHARED_LIBRARY #生成一个动态库
BUILD_STATIC_LIBRARY #生成一个静态的库
BUILD_PACKAGE #生成一个APK
3 变量使用
在Android.mk中,同样可以使用变量,并且变量可以在mk文件和cpp文件中使用,具体使用方式如下:
在Android.mk文件中使用变量
USE_VAR := YES
ifeq ($(USE_VAR), YES) else endif
在cpp文件中使用mk文件中定义的变量,在mk文件中使用“变量 := -D+变量名”形式定义变量,然后追加到LOCAL_CFLAGS变量中,否则定义的变量将不会生效。
//cpp
#ifdef TCC_MEM_512MB
LOGD("TCC_MEM_512MB define in here");
#endif
#mk
BOARD_MEM_FLAGS := -DTCC_MEM_512MB
LOCAL_CFLAGS += $(BOARD_MEM_FLAGS)
LOCAL_CFLAGS表示编译器选项,其中有一个作用就是用来定义宏,例如,上面的在cpp文件中使用mk中定义的宏,可以简写成如下形式:
LOCAL_CFLAGS := -DTCC_MEM_512MB
4 源文件列表编写
在参考资料“编写Android.mk中的LOCAL_SRC_FILES的终极技巧”中,详细介绍了如何使用简单有效的手段编写编译的源文件列表,因此,此处不再赘述。
5 使用cygwin+NDK实现JNI开发
安装好cygwin后,按照如下方式配置NDK环境变量:
a.修改C:\cygwin\home\Administrator目录下.bash_profile文件,添加如下内容:
NDK=/cygdrive/d/program/android/ndk/ export NDK
NDK变量中“d/program/android/ndk/ ”代表本机NDK安装路径,需要按照自己机器路径替换,配置好.bash_profile文件后,使用source .bash_profile命令使配置生效。
b.查看PATH环境变量中,是否配置了NDK安装路径,如果没有,请自行添加。

c.在Eclipse中配置NDK_BUILDER编译器
在工程名称上右击—>Properties—>Builder—>New,在弹出的对话框中填入如下的配置信息,根据个人安装环境配置:

其中Arguments中的”e/demo/android/JNIDemo/jni”表示你编译的项目的路径。
d.最后将配置的NDK_BUILD编译选项置为编译过程的最开始。
至此,完成NDK开发的全部配置编译过程。
6 参考资料
编写Android.mk中的LOCAL_SRC_FILES的终极技巧
详解android.mk-2016.01.18的更多相关文章
- adb shell 命令详解,android
http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...
- adb shell 命令详解,android, adb logcat
http://www.miui.com/article-275-1.html http://noobjava.iteye.com/blog/1914348 adb shell 命令详解,android ...
- (转载)实例详解Android快速开发工具类总结
实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...
- 详解Android首选项框架ListPreference
详解Android首选项框架ListPreference 原文地址 探索首选项框架 在深入探讨Android的首选项框架之前,首先构想一个需要使用首选项的场景,然后分析如何实现这一场景.假设你正在编写 ...
- 详解android:scaleType属性
详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262 http://juliaailse. ...
- 详解Android Activity---启动模式
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
- Android Binder IPC详解-Android学习之旅(96)
linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...
- 详解Android中的四大组件之一:Activity详解
activity的生命周期 activity的四种状态 running:正在运行,处于活动状态,用户可以点击屏幕,是将activity处于栈顶的状态. paused:暂停,处于失去焦点的时候,处于pa ...
- 图文详解 Android Binder跨进程通信机制 原理
图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...
- 详解 Android 通信
详解 Android 通信 :http://www.androidchina.net/5028.html
随机推荐
- Git-Flow
Overview Git-Flow is a high-level command set wrapping low-level Git commands to support the "s ...
- Hadoop MapReduce编程学习
一直在搞spark,也没时间弄hadoop,不过Hadoop基本的编程我觉得我还是要会吧,看到一篇不错的文章,不过应该应用于hadoop2.0以前,因为代码中有 conf.set("map ...
- CF 445A 简单DP
今天早上找一道题的bug,还是找不出来,下午刷了几道水题,晚上准备回家的事, 然后本来想打CF的,一看,数学场,不打了. 这道题的题意: 给出一个序列,每次你可以从这个序列里面选择一个数ak,删除,然 ...
- Eclipse中generate getter and setter对boolean的反应
有点意思 , 如果变量是boolean类型的 ,就会生成isxxx开头的getter方法 , 但如果是Boolean对象的 , 就会生成getterxx开头的getter对象. 例如 Boolean ...
- 配置jetty 远程调试
该调试不支持hessian 接口调用 1.配置远程jetty 服务器的 bin/jetty.sh JAVA_OPTIONS+=("-Xdebug -Xrunjdwp:server=y,tra ...
- Android开发者需要面对的8大挑战
移动开发变得越来越受欢迎,但移动开发者正面临着一系列挑战.本文将介绍的是Android开发者需要面对的8个不利因素,例如缺乏硬件标准化,以及软件碎片.为Android OS开发app,给予了开发人员极 ...
- U盘安装Linux CentOS 6.5 64位操作系统(来自互联网)
从centOS6.5开始直接把iso文件写入u盘就行了. 方法1:windows平台:1.用UltraISO打开iso(如:CentOS-6.5-x86_64-bin-DVD1.iso)2.然后点“启 ...
- 查看linux的版本
1. uname -a ~$ uname -a Linux lubuntu-Vostro-A840 3.19.0-73-generic #81-Ubuntu SMP Tue Oct 18 16:02: ...
- 立体匹配:关于Middlebury提供的源码的简化后的结构
- HYSBZ 1036 【树链剖分】
思路: 裸裸的树链剖分.... 树链剖分就是把一棵树分成若干重链和轻链...然后保证形成的线段树上每条链是连续存储的.然后这样就能用线段树进行维护了. 但是每次一定要保证是在同一条链里边....思路就 ...