Android.mk语法说明(android ndk开发)

下面是我个人对Android-ndk-r4版本中Android.mk文件做的翻译,由于自己英语水平和专业知识的限制,有些地方可能翻译的不是很准确,敬请指正,本文仅希望对做android NDK开发的同仁们能提供一点点的帮助而已。

Android.mk文件是用来描述你想要编译进系统的资源的。

这个文件的语法允许你把你的资源打包进“modules”。Module应该是下面module中的一种:

- a static library

- a shared library

只有shared library会被打包到你的应用程序中,尽管static library也能用来生产shared library。

你可以在一个Android.mk中定义多个module,你也可以在几个module中使用相同的资源文件。

编译系统会为你处理一些细节。例如,你不需要在你的Android.mk文件中列出你的头文件或是你的文件之间明确的依赖关系。NDK编译系统会自动帮你处理。

这同时意味着,当升级到新版本的NDK时,你不需要动你的Android.mk文件就可以使用心得toolchain/platform支持。

注意,用在Android.mk文件中的语法和整个的android平台的开源资源语法是不同的。编译系统实现了对他们不同的使用,这是故意这样设计的,用来允许应用开发人员更容易地重用外部库资源代码。

一个简单的例子:

在语法详细说明之前,让我们先来看一个简单的“hello-jni”例子,文件在$NDK/samples/hello-jni下:

在这我们可以看到:

-src目录下包含这个简单的android工程的一个java源文件

-jni目录下包含了这个例子的本地源文件

这个源文件实现了一个简单的共享库,这个共享库实现了一个想vm应用程序返回一个字符串的本地方法。

-Android.mk文件向NDK编译系统描述了一个共享库。它的内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
   LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY

现在让我们来解释这些语法:

LOCAL_PATH := $(call my-dir)

一个Android.mk文件必须以定义一个LOCAL_PATH 变量开始。它用来在你的工程树形目录下定位你的资源文件的位置。在这个例子中,那个编译系统提供的“my-dir”宏函数用来返回当前目录的路径(Android.mk文件所在的目录)。

include $(CLEAR_VARS)

编译系统提供的一个指向特殊的GNU Makefile文件的CLEAR_VARS变量将为你清理很多LOCAL_PATH中的LOCAL_XXX变量(例如: LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等)。这是有必要的,因为所有的编译控制文件都会在一个单独的GNU Make可执行上下文中被解析,在这里所有的变量都是全局的。

LOCAL_MODULE := hello-jni

用来标识分布在Android.mk文件中的每一个module的LOCAL_MODULE变量必须定义。名字必须是唯一的而且不能有空格。

注意,编译系统会给相应的生成文件自动地添加适当的前缀和后缀。换句话说,一个命名为“foo”的共享库module将生成名为“libfoo.so”的文件。

重点注意:

如果你的module命名为“libfoo”,编译系统不会为你添加另外一个“lib”前缀,还是会生成一个“libfoo.so”的文件而已。这个为了支持你需要使用的android平台资源的Android.mk文件。

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES变量必须包含一个将要被编译和汇编进module的一个C/C++资源文件列表。注意你不需要列出头文件和包含文件,因为编译系统会自动帮你计算依赖关系;仅仅需要列出直接传递给编译器的资源文件就可以了。

注意:默认的C++资源文件的扩展名是“.cpp”。然而可以通过定义LOCAL_DEFAULT_CPP_EXTENSION变量来指定一个不同的扩展名。不要忘记最开始的dot(例如:.cxx是可以的,但是cxx是不行的)。

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY是编译系统提供的一个指向GNU Makefile脚本的变量,它负责收集从最近的include $(CLEAR_VARS)' 变量开始的所有内定义的 LOCAL_XXX变量的信息,然后决定哪些需要编译以及怎样编译。BUILD_STATIC_LIBRARY变量可以生成一个static library。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzpjj.html