- 浏览: 929084 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
itzhongyuan:
java Random类详解 -
david_je:
你好,我看到你在C里面回调JAVA里面的方法是在native里 ...
Android NDK开发(1)----- Java与C互相调用实例详解 -
fykyx521:
请求锁是在 oncreate 释放实在ondestroy?? ...
Android如何保持程序一直运行 -
aduo_vip:
不错,总结得好!
Android读取assets目录下的资源 -
f839903061:
给的网址很给力哦!
Android 4.0.1 源码下载,编译和运行
序言:
-------------
此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C++源文件。
为了明白下面的内容,你必须已经阅读了docs/OVERVIEW.TXT的内容,它解释了Android.mk文件扮演的角色
和用途。
概述:
---------
写一个Android.mk文件是为了向生成系统描述你的源代码。更明确的说:
- 这个文件实际上是GNU Make文件的一小片段,它会被生成系统解析一次或多次。
因此,你应该在Android.mk里尽量少地声明变量,而不要误以为在解析的过程中
没有任何东西被定义。
- 该文件的语法的明的人为了让你能将你的源代码组织为组件(module).一个组件指的是下面的一项:
- 一个静态库(static library)
- 一个共享库(shared library)
只有一个动态库会被安装/拷贝至你的application package中。但是静态库可用来
生成动态库。
你可以在每个Android.mk文件定义一个或多个组件,并且我可以在几个组件中使用
相同的源文件。
- 生成系统为你处理了一些琐碎之事。比如,在你的Android.mk里,你不须要列出头文件或
列出生成的文件之间的明确认依赖关系。NDK生成系统会为你自动生成。
这也意味着,当更新至新的NDK版本时,你能得到新的工具链/平台支持(toolchain/platform support)
的好处,而无须修改你的android.mk文件。
需要注意的是,此语法与完全开源的Android平台的Android.mk文件的语法非常相似,但使用它们的
生成系统的实现不同,这个为了让开发者能更容易的复用“外部”库的源代码。
简单例子:
---------------
在详细描述语法之前,让我们探究一个简单的“hello JNI”例子,它的文件位于:
apps/hello-jni/projec
这里,我们能看到:
- 放有Java源文件的src文件夹。
- 放有本地源文件,即jni/hello-jni.c的jni文件夹。
这个源文件实现一个简单的共享库。这个共享库有一个本地方法(native method),它将一个字符串
返回给虚拟机应用(著:即Java层应用程序)
- jni/Anroid.mk文件为NDK生成系统描述了这个共享库。它的内容为:
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------
现在,让我们逐行解释:
LOCAL_PATH := $(call my-dir)
每个Android.mk文件都必须以定义LOCAL_PATH变量开始。其目的是为了定位源文件的位置。在这个例子,
生成系统提供的宏函数(macro function)‘my-dir'用来返回当前路径(即放有Android.mk文件的文件夹)
include $(CLEAR_VARS)
CLEAR_VARS变量是生成系统提供的,它指向一个特殊的GNU Makefile.这个Makefile将会为你自动清除
许多名为LOCAL_XXX的变量(比如:LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等),
但LOCAL_PATH是例外,它不会被清除。这些变量的清除是必须的,因为所有的控制文件是在单一的GNU make
执行环境中解析的,在这里所有的变量都是全局的。
LOCAL_MODULE := hello-jni
为了在你的Android.mk文件标识每个组件,必须定义LOCAL_MODULE变量。这个名字必须要唯一的并且不能
包含空格。注意:生成系统会自动地为相应生成的文件加入前缀或后缀。换言之,一个名叫foo的共享库组件
会生成'libfoo.so'.
重要注意事项:
如果你把组件取名为‘libfoo',生成系统将不会加上‘lib'前缀,还是
生成libfoo.so。这是为了支持源于Android平台源代码的Android.mk文件。
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES变量必须包含一系列将被构建和组合成组件的C/C++源文件。注意:你
不需要列出头文件或include文件,因为生成系统会为你自动计算出源文件的依赖关系。
仅仅列出那些将直接传给编译器的源文件足矣。
注意,默认的C++源文件的扩展名是‘.cpp'。但你可以通过定义LOCAL_DEFAULT_EXTENSION
来指定一个扩展名。别忘了扩展名开始的那一点(比如,‘.cxx’,能行,但‘cxx'不行)。
include $(BUILD_SHARED_LIBRARY)
生成系统提供的BUIL_SHARED_LIBRARY变量指向一个GNU Makefile脚本,这个脚本主管
收集在最近的一次#include $(CLEAR_VARS)(著:即清除'本地'变量)之后你所定义的
LOCAL_XXX变量的信息,并决定生成什么,如何准确的生成。BUILD_STATIC_LIBRARY可
生成一个静态库。
There are more complex examples under apps/, with commented
Android.mk files that you can look at.
在apps文件下有一些复杂点的例子,它带有注释的Android.mk文件以供你学习。
参考:
-----------
以下列出你在Android.mk里应该依赖或定义的变量。你能定义其它变量,但下列的变量名是
由NDK生成系统保留的。
- 以LOCAL_ 开头的变量名 (比如,LOCAL_MODULE)
- 以PRIVATE_ ,NDK_ 或 APP_ (内部使用)开头的量名
_ 小写字母变量名(内部使用,如 my-dir).
如果你需要在Android.mk里定义方便自己使用的变量名,我们建议使用MY_ 前缀,
如下面一个简单例子:
---------- cut here ------------------
MY_SOURCES := foo.c
ifneq ($(MY_CONFIG_BAR),)
MY_SOURCES += bar.c
endif
LOCAL_SRC_FILES += $(MY_SOURCES)
---------- cut here ------------------
So, here we go:
NDK提供的变量:
- - - - - - - - - - - - - -
下列的这些GNU Make变量是在你的Android.mk被解析之前,就被生成系统事先定义
的了.注意,在某些情况下,NDK可能会多次解析你的Android.mk,每次对其中一些变量的
定义不同。
CLEAR_VARS
指向一个生成脚本,这个脚本取消几乎所有LOCAL_XXX变量的定义(译者注:除了LOCAL_PATH)。
在开始描述一个新的组件之前,你必须include这个脚本,e.g.:
include $(CLEAR_VARS)
BUILD_SHARED_LIBRARY
指向一个生成脚本,这个脚本通过LOCAL_XXX变量收集关于组件的信息,并决定如何
根据你列出来的源文件生成目标分享库。注意,在include这个脚本文件之前你必须
至少已经定义了LOCAL_MODULE和LOCAL_SRC_FILES。用法举例:
include $(BUILD_SHARED_LIBRARY)
注意,这会生成一个名为 lib$(LOCAL_MODULE).so的文件。(译者注:$(BUILD_SHARED_MODULE)为文件名)
BUILD_STATIC_LIBRARY
与BUILD_SHARED_LIBRARY类似,但用来生成目标静态库。静态库不会被拷贝至你的
project/packages文件夹下,但可用来生成分享库(参考 LOCAL_STATIC_LIBRARIES
和LOCAL_STATIC_WHOLE_LIBRARIES,将在后面描述)
用法示例:
include $(BUILD_STATIC_LIBRARY)
注意,这会生成一个方件名叫lib$(LOCAL_MODULE).a
TARGET_ARCH
目标CPU的名字,在完整的Android开源代码的生成中指定。对于基于ARM兼容的CPU,
它被指定为'arm',与CPU架构的修订无关。
TARGET_PLATFORM
当解析该Android.mk文件时用它来指定Andoid目标平台的名称。譬如,'android-3'与
Android 1.5系统镜像相对应。若要了解所有的平台名称及其相应的Android系统镜像,
请阅读docs/STABLE-APIS.TXT
TARGET_ARCH_ABI
当解析该Android.mk时,CPU+ABI的名称。目前只有一个值。
(译者注:ABI,Application Binary Interface,二进制应用程序接口)
armeabi For Armv5TE
armeabi 指定Armv5TE
注意:到NDK 1.6_r1为止,仅简单的定义这个变量为'arm'。但为了更好地配合
Android平台的内部使用,该值已重定义。
关于ABI与相应的兼容问题更多详情,请阅读docs/CPU-ARCH-ABIS.TXT
未来的NDK版本将会引入其它的平台的ABI并会有不同的名称。注意,所有基于ARM的ABI会
使TARGET_ARCH定义为'arm',但可能拥有不同的TARGET_ARCH_ABI
TARGET_ABI
目标平台与abi的连接,它实际上被定义为 $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI),
当你想在一个真实的装置上测试特定的目标系统镜像时,它就很有用了。
默认下,它的值为'android-3-armeabi'
(在Android NDK 1.6_r1及之前的版本,它的默认值为'android-3-arm')
NDK提供的宏函数:
----------------------------
以下是一些GNU Make的宏‘函数’,必须通过这样的形式调用:'$(call <function>)'。
函数返回文本信息。
my-dir
返回放置当前Android.mk的文件夹相对于NDK生成系统根目录的路径。可用来
在Android.mk的开始处定义LOCAL_PATH的值:
LOCAL_PATH := $(call my-dir)
all-subdir-makefiles
返回‘my-dir’子目录下的所有Android.mk。比如,代码的结构如下:
sources/foo/Android.mk
sources/foo/lib1/Android.mk
sources/foo/lib2/Android.mk
如果sources/foo/Android.mk里有这样一行:
include $(call all-subdir-makefiles)
那么,它将会自动地includesources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk
这个函数能将深层嵌套的代码文件夹提供给生成系统。注意,默认情况下,NDK仅在
source/*/Android.mk里寻找文件。
this-makefile
返回当前Makefile(译者注:指的应该是GNU Makefile)的路径(即,这个函数是在哪里调用的)
parent-makefile
返回在列入树(inclusion tree)中的父makefile的路径。
即,包含当前makefile的那个makefile的路径。
grand-parent-makefile
猜猜看...(译者注:原文为Guess what...)
组件描述相关的变量:
- - - - - - - - - -
以下的变量是用来向生成系统描述你的组件的。你应该在'include $(CLEAR_VARS)'
和'include $(BUILD_XXXXX)'之间定义其中的一些变量。正如在前面所说的,$(CLEAR_VARS)
是一个将会取消所有这些变量的脚本,除非在对变量的描述时有显式的说明。
LOCAL_PATH
这个变量用来设置当前文件的路径。你必须在Android.mk的开始处定义它,比如:
LOCAL_PATH := $(call my-dir)
这个变量不会被$(CLEAR_VARS)消除,所以每个Android.mk仅需一个定义(以防你在
同一个文件里定义几个组件)。
LOCAL_MODULE
定义组件的名称。对于所有的组件名,它必须是唯一,且不能包含空格。
在include $(BUILD_XXX)之前你必须定义它。
这个组件名决定生成的文件(译者注:即库名)。比如,lib<foo>,即这个组件的名称
为<foo>。但是在你的NDK生成文件(不管是Android.mk还是Application.mk)中
你只能通过‘正常’的名称(如,<foo>)来引用其它的组件。
LOCAL_SRC_FILES
用它来定义所有用来生成组件的源文件。仅须列出传给编译器的文件,因为
生成系统会自动地计算它们的相互依赖关系。
注意,所有文件名都是相对于LOCAL_PATH的,你可以用到路径组件(path component)
如:
LOCAL_SRC_FILES := foo.c \ (译者注:‘\’为连接符)
toto/bar.c
LOCAL_CPP_EXTENSION
这是一个可选的变量,可用它来指明C++源文件的扩展名。默认情况下是'.cpp',
但你可以改变它。比如:
LOCAL_CPP_EXTENSION := .cxx
LOCAL_C_INCLUDES
一个相对于相对于NDK*根*目录可选的路径名单,当编译所有的源文件(C,C++和汇编)时,
它将被添加进include搜索路径。例如:
LOCAL_C_INCLUDES := sources/foo
或者甚至:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
LOCAL_CFLAGS
一个可选的编译标记集,在生成C与C++源文件时,将解析它。
对指定额外的宏定义或编译选项很有用。
重要:不要试图改变你Android.mk里的optimization/debuggin level,通过
在你的Android.mk里指定合适的信息,它将被自动处理,并使NDK生成
调试时可用的有用的数据文件。
注意:在android-ndk-1.5_r1,相应的标记(flags)只适用于C源文件,对C++
源文件并不适用。为了适用于完整的Android生成系统的特性,已作了修
正。(现在,你可以使用LOCAL_CPPFLAGS为C++文件指定标记)
LOCAL_CXXFLAGS
LOCAL_CPPFLAGS的别名。注意,不建议使用这个变量,因为在未来的NDK版本中,
它可能会消失。
LOCAL_CPPFLAGS
一个可选的编译标记集,*仅*在生成C++源文件时解析它。在编译器的命令行里
它将在LOCAL_CFLAGS之后出现。
注意:在android-ndk-1.5_r1,相应的标记(flags)适用于C与C++源文件。
为了适用于完整的Android生成系统的特性,已作了修
正。(现在,你可以使用LOCAL_CFLAGS为C和C++源文件指定标记)
LOCAL_STATIC_LIBRARIES
一份static libraries组件的名单(以BUILD_STATIC_LIBRARY的方式生成),它将被
连接到欲生成的组件上。这仅在生成shared library组件时有意义。(译者注:将指定
的一个或多个static library module转化为一个shared library module)
LOCAL_SHARED_LIBRARIES
一份该组件在运行期依赖于它的shared libraries *组件*。在连接时间(link time)里
与及为该生成的文件嵌入相应的信息都要用到它。
注意,它并不将这份组件名单添加入生成图表(build graph)。即,在你的Android.mk
里,你仍应该将它们加入到你的应用程序要求的组件。
LOCAL_LDLIBS
一份能在生成你的组件时用到的额外的连接器标记(linkerflags)的名单。在传递
有“-l”前缀的特殊系统库的名称时很有用。比如,下面的语句会告诉连接器在装载
时间(load time)里生成连接到/system/lib/libz.so的组件。
LOCAL_LDLIBS := -lz
若想知道在这个NDK版本可以连接哪些暴露的系统库(exposed system libraries),
请参见docs/STABLE-APIS。
LOCAL_ALLOW_UNDEFINED_SYMBOLS
缺省值情况下,当尝试生成一个shared library遇到没有定义的引用时,会导致“undefined
symbol”error。这对在你的源代码里捕捉bugs有很大的帮助。
但是,因为一些原因你须要disable这个检查,将这个变量设置为'true’。注意,相应
的shared library可能在运行期装载失败。
LOCAL_ARM_MODE
缺省值情况下,ARM目标二进制将会以‘thumb’模式生成,这时每个指令都是16-bit宽的。
如果你想强迫组件的object文件以‘arm’(32位的指令)的模式生成,你可以将这个变量
定义为'arm'。即:
LOCAL_ARM_MODE := arm
注意,你也可以通过将‘.arm’后缀添加到源文件名字的后面指示生成系统将指定的
源文件以arm模式生成。例如:
LOCAL_SRC_FILES := foo.c bar.c.arm
告诉生成系统总是以arm模式编译‘bar.c’,但根据LOCAL_ARM_MODE的值生成foo.c
注意:在你的Application.mk里将APP_OPTIM设置为'debug',这也会强迫生成ARM二进制
代码。这是因为工具链的调度器有bugs,它对thumb码的处理不是很好。
-------------
此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C++源文件。
为了明白下面的内容,你必须已经阅读了docs/OVERVIEW.TXT的内容,它解释了Android.mk文件扮演的角色
和用途。
概述:
---------
写一个Android.mk文件是为了向生成系统描述你的源代码。更明确的说:
- 这个文件实际上是GNU Make文件的一小片段,它会被生成系统解析一次或多次。
因此,你应该在Android.mk里尽量少地声明变量,而不要误以为在解析的过程中
没有任何东西被定义。
- 该文件的语法的明的人为了让你能将你的源代码组织为组件(module).一个组件指的是下面的一项:
- 一个静态库(static library)
- 一个共享库(shared library)
只有一个动态库会被安装/拷贝至你的application package中。但是静态库可用来
生成动态库。
你可以在每个Android.mk文件定义一个或多个组件,并且我可以在几个组件中使用
相同的源文件。
- 生成系统为你处理了一些琐碎之事。比如,在你的Android.mk里,你不须要列出头文件或
列出生成的文件之间的明确认依赖关系。NDK生成系统会为你自动生成。
这也意味着,当更新至新的NDK版本时,你能得到新的工具链/平台支持(toolchain/platform support)
的好处,而无须修改你的android.mk文件。
需要注意的是,此语法与完全开源的Android平台的Android.mk文件的语法非常相似,但使用它们的
生成系统的实现不同,这个为了让开发者能更容易的复用“外部”库的源代码。
简单例子:
---------------
在详细描述语法之前,让我们探究一个简单的“hello JNI”例子,它的文件位于:
apps/hello-jni/projec
这里,我们能看到:
- 放有Java源文件的src文件夹。
- 放有本地源文件,即jni/hello-jni.c的jni文件夹。
这个源文件实现一个简单的共享库。这个共享库有一个本地方法(native method),它将一个字符串
返回给虚拟机应用(著:即Java层应用程序)
- jni/Anroid.mk文件为NDK生成系统描述了这个共享库。它的内容为:
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------
现在,让我们逐行解释:
LOCAL_PATH := $(call my-dir)
每个Android.mk文件都必须以定义LOCAL_PATH变量开始。其目的是为了定位源文件的位置。在这个例子,
生成系统提供的宏函数(macro function)‘my-dir'用来返回当前路径(即放有Android.mk文件的文件夹)
include $(CLEAR_VARS)
CLEAR_VARS变量是生成系统提供的,它指向一个特殊的GNU Makefile.这个Makefile将会为你自动清除
许多名为LOCAL_XXX的变量(比如:LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等),
但LOCAL_PATH是例外,它不会被清除。这些变量的清除是必须的,因为所有的控制文件是在单一的GNU make
执行环境中解析的,在这里所有的变量都是全局的。
LOCAL_MODULE := hello-jni
为了在你的Android.mk文件标识每个组件,必须定义LOCAL_MODULE变量。这个名字必须要唯一的并且不能
包含空格。注意:生成系统会自动地为相应生成的文件加入前缀或后缀。换言之,一个名叫foo的共享库组件
会生成'libfoo.so'.
重要注意事项:
如果你把组件取名为‘libfoo',生成系统将不会加上‘lib'前缀,还是
生成libfoo.so。这是为了支持源于Android平台源代码的Android.mk文件。
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES变量必须包含一系列将被构建和组合成组件的C/C++源文件。注意:你
不需要列出头文件或include文件,因为生成系统会为你自动计算出源文件的依赖关系。
仅仅列出那些将直接传给编译器的源文件足矣。
注意,默认的C++源文件的扩展名是‘.cpp'。但你可以通过定义LOCAL_DEFAULT_EXTENSION
来指定一个扩展名。别忘了扩展名开始的那一点(比如,‘.cxx’,能行,但‘cxx'不行)。
include $(BUILD_SHARED_LIBRARY)
生成系统提供的BUIL_SHARED_LIBRARY变量指向一个GNU Makefile脚本,这个脚本主管
收集在最近的一次#include $(CLEAR_VARS)(著:即清除'本地'变量)之后你所定义的
LOCAL_XXX变量的信息,并决定生成什么,如何准确的生成。BUILD_STATIC_LIBRARY可
生成一个静态库。
There are more complex examples under apps/, with commented
Android.mk files that you can look at.
在apps文件下有一些复杂点的例子,它带有注释的Android.mk文件以供你学习。
参考:
-----------
以下列出你在Android.mk里应该依赖或定义的变量。你能定义其它变量,但下列的变量名是
由NDK生成系统保留的。
- 以LOCAL_ 开头的变量名 (比如,LOCAL_MODULE)
- 以PRIVATE_ ,NDK_ 或 APP_ (内部使用)开头的量名
_ 小写字母变量名(内部使用,如 my-dir).
如果你需要在Android.mk里定义方便自己使用的变量名,我们建议使用MY_ 前缀,
如下面一个简单例子:
---------- cut here ------------------
MY_SOURCES := foo.c
ifneq ($(MY_CONFIG_BAR),)
MY_SOURCES += bar.c
endif
LOCAL_SRC_FILES += $(MY_SOURCES)
---------- cut here ------------------
So, here we go:
NDK提供的变量:
- - - - - - - - - - - - - -
下列的这些GNU Make变量是在你的Android.mk被解析之前,就被生成系统事先定义
的了.注意,在某些情况下,NDK可能会多次解析你的Android.mk,每次对其中一些变量的
定义不同。
CLEAR_VARS
指向一个生成脚本,这个脚本取消几乎所有LOCAL_XXX变量的定义(译者注:除了LOCAL_PATH)。
在开始描述一个新的组件之前,你必须include这个脚本,e.g.:
include $(CLEAR_VARS)
BUILD_SHARED_LIBRARY
指向一个生成脚本,这个脚本通过LOCAL_XXX变量收集关于组件的信息,并决定如何
根据你列出来的源文件生成目标分享库。注意,在include这个脚本文件之前你必须
至少已经定义了LOCAL_MODULE和LOCAL_SRC_FILES。用法举例:
include $(BUILD_SHARED_LIBRARY)
注意,这会生成一个名为 lib$(LOCAL_MODULE).so的文件。(译者注:$(BUILD_SHARED_MODULE)为文件名)
BUILD_STATIC_LIBRARY
与BUILD_SHARED_LIBRARY类似,但用来生成目标静态库。静态库不会被拷贝至你的
project/packages文件夹下,但可用来生成分享库(参考 LOCAL_STATIC_LIBRARIES
和LOCAL_STATIC_WHOLE_LIBRARIES,将在后面描述)
用法示例:
include $(BUILD_STATIC_LIBRARY)
注意,这会生成一个方件名叫lib$(LOCAL_MODULE).a
TARGET_ARCH
目标CPU的名字,在完整的Android开源代码的生成中指定。对于基于ARM兼容的CPU,
它被指定为'arm',与CPU架构的修订无关。
TARGET_PLATFORM
当解析该Android.mk文件时用它来指定Andoid目标平台的名称。譬如,'android-3'与
Android 1.5系统镜像相对应。若要了解所有的平台名称及其相应的Android系统镜像,
请阅读docs/STABLE-APIS.TXT
TARGET_ARCH_ABI
当解析该Android.mk时,CPU+ABI的名称。目前只有一个值。
(译者注:ABI,Application Binary Interface,二进制应用程序接口)
armeabi For Armv5TE
armeabi 指定Armv5TE
注意:到NDK 1.6_r1为止,仅简单的定义这个变量为'arm'。但为了更好地配合
Android平台的内部使用,该值已重定义。
关于ABI与相应的兼容问题更多详情,请阅读docs/CPU-ARCH-ABIS.TXT
未来的NDK版本将会引入其它的平台的ABI并会有不同的名称。注意,所有基于ARM的ABI会
使TARGET_ARCH定义为'arm',但可能拥有不同的TARGET_ARCH_ABI
TARGET_ABI
目标平台与abi的连接,它实际上被定义为 $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI),
当你想在一个真实的装置上测试特定的目标系统镜像时,它就很有用了。
默认下,它的值为'android-3-armeabi'
(在Android NDK 1.6_r1及之前的版本,它的默认值为'android-3-arm')
NDK提供的宏函数:
----------------------------
以下是一些GNU Make的宏‘函数’,必须通过这样的形式调用:'$(call <function>)'。
函数返回文本信息。
my-dir
返回放置当前Android.mk的文件夹相对于NDK生成系统根目录的路径。可用来
在Android.mk的开始处定义LOCAL_PATH的值:
LOCAL_PATH := $(call my-dir)
all-subdir-makefiles
返回‘my-dir’子目录下的所有Android.mk。比如,代码的结构如下:
sources/foo/Android.mk
sources/foo/lib1/Android.mk
sources/foo/lib2/Android.mk
如果sources/foo/Android.mk里有这样一行:
include $(call all-subdir-makefiles)
那么,它将会自动地includesources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk
这个函数能将深层嵌套的代码文件夹提供给生成系统。注意,默认情况下,NDK仅在
source/*/Android.mk里寻找文件。
this-makefile
返回当前Makefile(译者注:指的应该是GNU Makefile)的路径(即,这个函数是在哪里调用的)
parent-makefile
返回在列入树(inclusion tree)中的父makefile的路径。
即,包含当前makefile的那个makefile的路径。
grand-parent-makefile
猜猜看...(译者注:原文为Guess what...)
组件描述相关的变量:
- - - - - - - - - -
以下的变量是用来向生成系统描述你的组件的。你应该在'include $(CLEAR_VARS)'
和'include $(BUILD_XXXXX)'之间定义其中的一些变量。正如在前面所说的,$(CLEAR_VARS)
是一个将会取消所有这些变量的脚本,除非在对变量的描述时有显式的说明。
LOCAL_PATH
这个变量用来设置当前文件的路径。你必须在Android.mk的开始处定义它,比如:
LOCAL_PATH := $(call my-dir)
这个变量不会被$(CLEAR_VARS)消除,所以每个Android.mk仅需一个定义(以防你在
同一个文件里定义几个组件)。
LOCAL_MODULE
定义组件的名称。对于所有的组件名,它必须是唯一,且不能包含空格。
在include $(BUILD_XXX)之前你必须定义它。
这个组件名决定生成的文件(译者注:即库名)。比如,lib<foo>,即这个组件的名称
为<foo>。但是在你的NDK生成文件(不管是Android.mk还是Application.mk)中
你只能通过‘正常’的名称(如,<foo>)来引用其它的组件。
LOCAL_SRC_FILES
用它来定义所有用来生成组件的源文件。仅须列出传给编译器的文件,因为
生成系统会自动地计算它们的相互依赖关系。
注意,所有文件名都是相对于LOCAL_PATH的,你可以用到路径组件(path component)
如:
LOCAL_SRC_FILES := foo.c \ (译者注:‘\’为连接符)
toto/bar.c
LOCAL_CPP_EXTENSION
这是一个可选的变量,可用它来指明C++源文件的扩展名。默认情况下是'.cpp',
但你可以改变它。比如:
LOCAL_CPP_EXTENSION := .cxx
LOCAL_C_INCLUDES
一个相对于相对于NDK*根*目录可选的路径名单,当编译所有的源文件(C,C++和汇编)时,
它将被添加进include搜索路径。例如:
LOCAL_C_INCLUDES := sources/foo
或者甚至:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
LOCAL_CFLAGS
一个可选的编译标记集,在生成C与C++源文件时,将解析它。
对指定额外的宏定义或编译选项很有用。
重要:不要试图改变你Android.mk里的optimization/debuggin level,通过
在你的Android.mk里指定合适的信息,它将被自动处理,并使NDK生成
调试时可用的有用的数据文件。
注意:在android-ndk-1.5_r1,相应的标记(flags)只适用于C源文件,对C++
源文件并不适用。为了适用于完整的Android生成系统的特性,已作了修
正。(现在,你可以使用LOCAL_CPPFLAGS为C++文件指定标记)
LOCAL_CXXFLAGS
LOCAL_CPPFLAGS的别名。注意,不建议使用这个变量,因为在未来的NDK版本中,
它可能会消失。
LOCAL_CPPFLAGS
一个可选的编译标记集,*仅*在生成C++源文件时解析它。在编译器的命令行里
它将在LOCAL_CFLAGS之后出现。
注意:在android-ndk-1.5_r1,相应的标记(flags)适用于C与C++源文件。
为了适用于完整的Android生成系统的特性,已作了修
正。(现在,你可以使用LOCAL_CFLAGS为C和C++源文件指定标记)
LOCAL_STATIC_LIBRARIES
一份static libraries组件的名单(以BUILD_STATIC_LIBRARY的方式生成),它将被
连接到欲生成的组件上。这仅在生成shared library组件时有意义。(译者注:将指定
的一个或多个static library module转化为一个shared library module)
LOCAL_SHARED_LIBRARIES
一份该组件在运行期依赖于它的shared libraries *组件*。在连接时间(link time)里
与及为该生成的文件嵌入相应的信息都要用到它。
注意,它并不将这份组件名单添加入生成图表(build graph)。即,在你的Android.mk
里,你仍应该将它们加入到你的应用程序要求的组件。
LOCAL_LDLIBS
一份能在生成你的组件时用到的额外的连接器标记(linkerflags)的名单。在传递
有“-l”前缀的特殊系统库的名称时很有用。比如,下面的语句会告诉连接器在装载
时间(load time)里生成连接到/system/lib/libz.so的组件。
LOCAL_LDLIBS := -lz
若想知道在这个NDK版本可以连接哪些暴露的系统库(exposed system libraries),
请参见docs/STABLE-APIS。
LOCAL_ALLOW_UNDEFINED_SYMBOLS
缺省值情况下,当尝试生成一个shared library遇到没有定义的引用时,会导致“undefined
symbol”error。这对在你的源代码里捕捉bugs有很大的帮助。
但是,因为一些原因你须要disable这个检查,将这个变量设置为'true’。注意,相应
的shared library可能在运行期装载失败。
LOCAL_ARM_MODE
缺省值情况下,ARM目标二进制将会以‘thumb’模式生成,这时每个指令都是16-bit宽的。
如果你想强迫组件的object文件以‘arm’(32位的指令)的模式生成,你可以将这个变量
定义为'arm'。即:
LOCAL_ARM_MODE := arm
注意,你也可以通过将‘.arm’后缀添加到源文件名字的后面指示生成系统将指定的
源文件以arm模式生成。例如:
LOCAL_SRC_FILES := foo.c bar.c.arm
告诉生成系统总是以arm模式编译‘bar.c’,但根据LOCAL_ARM_MODE的值生成foo.c
注意:在你的Application.mk里将APP_OPTIM设置为'debug',这也会强迫生成ARM二进制
代码。这是因为工具链的调度器有bugs,它对thumb码的处理不是很好。
发表评论
-
Android使用binder访问service的方式
2013-08-23 09:42 16311. 我们先来看一个与本地service通信的例子。 pub ... -
android-Service和Thread的区别
2013-08-23 09:17 914servie是系统的组件,它由系统进程托管(servicema ... -
git介绍
2013-08-01 14:49 1035git介绍 使用Git的第一件事就是设置你的名字和email ... -
cocos2d-x学习之自动内存管理和常见宏
2013-07-29 15:41 9081.自动内存管理 1)概述 C++语言默认是 ... -
cocos2dx中利用xcode 调用java中的函数
2013-07-29 11:36 25251. 先把cocos2dx根目录中的 /Users/zhaos ... -
cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解
2013-07-29 10:35 1109第一个改动: CCLayer初始化 自定义Layer,类名 ... -
xcode与eclipse整合cocos2dx
2013-07-29 10:32 1220文档xcode版本是 204 1. 在xcode中创建coc ... -
git提交代码
2013-07-23 16:00 10531. 在本地创建一个Git的工作空间,在里面创建一个工程(如H ... -
Android.mk的用法和基础
2013-07-19 14:11 4332一个Android.mk file用来向编译系统描述你的源代码 ... -
eclipse配置NDK-Builder命令
2013-07-18 11:02 10351. 2. -
eclipse配置javah命令
2013-07-18 10:48 19931.找到javah命令所在的目录 我的为 /usr/bi ... -
Android SDL2.0 编译
2013-07-17 13:40 19671,下载: wget http://www.libsdl.o ... -
IntelliJ Idea 常用快捷键列表
2013-05-27 10:19 0Alt+回车 导入包,自动修 ... -
android应用后台安装
2013-05-21 12:02 1015android应用后台安装,静默安装的代码实现方法 http ... -
编译linux内核映像
2013-05-21 11:33 962a)准备交叉编译工具链 android代码树中有一个pr ... -
如何单独编译Android源代码中的模块
2013-05-21 11:29 994一. 首先在Android源代码 ... -
Ubuntu安装JDK6和JDK5
2013-05-19 19:04 1006sudo apt-get install sun-java6- ... -
JNI详解001_c++
2013-05-09 14:57 817public class HelloWorld { p ... -
java_jni详解_04
2013-05-09 14:13 1123public class ObjectArrayTest{ ... -
jni docs
2013-05-09 12:18 884http://docs.oracle.com/javase/1 ...
相关推荐
### Android.mk 文件语法规范及使用模板详解 #### 一、引言 在深入探讨`Android.mk`文件的具体语法规范和使用模板之前,我们先来简要回顾一下`Android.mk`文件的基本概念及其在Android NDK中的作用。`Android.mk`...
Android.mk文件语法规范(a)[参照].pdf
在深入了解Android.mk文件的语法规范之前,我们需要先了解Android.mk文件的基本概念及其在Android NDK中的角色。Android.mk文件是Android NDK项目中用于描述C/C++源文件编译规则的重要配置文件。通过合理设置Android...
一个Android.mk file用来向编译系统描述你的源代码。具体来说:-该文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。因此,您应尽量减少您声明的变量,不要认为某些变量在解析过程中不会被...
### Android.mk 编译系统与文件语法规范 #### 引言 `Android.mk`作为Android NDK中的核心配置文件之一,主要用于向构建系统描述项目的C/C++源代码组织方式及构建逻辑。对于深入理解Android NDK项目构建流程、优化...
理解 Android.mk 的基本语法和常用变量对于利用 Android NDK 进行高效开发至关重要。 通过遵循 Android.mk 的规范,开发者可以更轻松地维护大型项目,并确保跨版本的一致性和可维护性。此外,这种标准化的方法也有...
### Android.mk 文件详解 #### 一、概述 在Android开发中,`Android.mk`是一个非常重要的文件,主要用于定义模块的构建规则。它基于GNU Make工具,是Android NDK(Native Development Kit)的一部分,用于编译C/...
Android.mk文件是Android Native Development Kit (NDK)中用于构建原生C/C++代码的关键文件。VS(Visual Studio)则是微软开发的一款强大的IDE,主要用于C++、C#等语言的开发。本主题涉及到将VS工程文件转换为适应...
本文档主要关注Android.mk文件的编写规范,帮助开发者理解其语法和作用。 首先,Android.mk文件的作用是向构建系统描述你的源代码,它可以定义一个或多个组件,包括静态库和共享库。静态库用于生成动态库,而动态库...
2. **Android.mk文件语法规范.doc**: Android.mk是Android NDK中的构建脚本,用于指定原生代码的编译和链接规则。这份文档详细解释了Android.mk文件的语法和结构,包括如何定义模块、指定源文件、链接库、设置编译...
#### 一、Android.mk文件语法规范及使用模板 **1.1 Android.mk文件介绍** 在Android开发中,特别是在利用NDK(Native Development Kit)进行原生开发时,`Android.mk`文件起着核心作用。它是描述项目中C/C++源代码...
本文旨在详细分析Android编译系统的核心组件——main.mk文件,以便更好地理解Android编译过程。 #### 二、Android编译系统概述 Android编译系统不仅负责编译生成目标系统的二进制文件和Java应用程序,还包括管理...
### 安卓mk脚本资料:深入理解Android.mk在安卓源码工程中的作用与规范 在安卓源码工程中,**Android.mk**脚本扮演着关键角色,它不仅管理着项目中的C/C++源代码,还负责这些代码的编译过程。通过Android.mk,...
这一步通常是在项目的根目录下执行的,它会读取Android.mk文件并构建出所需的.so文件。 6. **加载动态库**: 最后,在Java代码中使用`System.loadLibrary`方法加载动态库,并通过native方法进行调用。 #### 三、...
创建`Android.mk`文件是构建过程的关键部分。这个文件定义了模块的属性,包括源文件、包名、依赖等。例如,设置`LOCAL_PACKAGE_NAME`为你的应用名,并在最后包含`$(BUILD_PACKAGE)`以构建APK。为了调试方便,设置`...
7. **Android.mk和Application.mk**:在Android NDK中,这两个文件用于配置构建过程,指定源文件、库依赖和编译选项等。 8. **LLVM/Clang**:NDK也支持使用LLVM/Clang作为编译器,它提供更好的错误信息和更现代的...
- AOSP的构建系统(通常是`build.gradle`或`Android.mk`)负责生成HIDL的C++绑定代码,并将其链接到目标二进制文件中。 - 开发者需要在项目配置中指定HIDL接口的依赖,并确保构建过程正确处理这些依赖。 7. **...