2.4.1 Android.mk(1)
Android.mk是一个向Android NDK构建系统描述NDK项目的GUN Makefile片段。它是每一个NDK项目的必备组件。构建系统希望它出现在jni子目录中。在Eclipse的Project Explorer中,双击Android.mk文件在编辑视图中打开它。程序清单2-1显示了hello-jni项目中Android.mk文件的内容。
程序清单2-1 hello-jni项目下Android.mk文件的内容
- # Copyright (C) 2009 The Android Open Source Project
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
- LOCAL_PATH := $(call my-dir)
-
- include $(CLEAR_VARS)
-
- LOCAL_MODULE := hello-jni
- LOCAL_SRC_FILES := hello-jni.c
-
- include $(BUILD_SHARED_LIBRARY)
为了更好地理解它的句法,我们逐行分析。因为这个是一个GUN Makefile片段,所以它的句法和其他Makefile是一样的。每行都包含一个单独的指令,以“#”开头的是注释行,GUN Make 工具不处理它们。根据命名规范,变量名要大写。
注释块后的第一条指令是用来定义LOCAL_PATH变量的。根据Android构建系统的要求,Android.mk文档必须以LOCAL_PATH变量的定义开头。
- LOCAL_PATH :=$(call my-dir)
Android构建系统利用LOCAL_PATH来定位源文件。因为将该变量设置为硬编码值并不合适,所以Android构建系统提供了一个名为my-dir的宏功能。通过将该变量设置为my-dir 宏功能的返回值,可以将其放在当前目录下。
Android构建系统将CLEAR_VARS变量设置为clear-vars.mk片段的位置。包含Makefile片段可以清除除了LOCAL_PATH以外的LOCAL_变量,例如LOCAL_MODULE与LOCAL_SRC_FILES等。
- Include $(CLEAR_VARS)
这样做是因为Android构建系统在单次执行中解析多个构建文件和模块定义,而LOCAL_是全局变量。清除它们可以避免冲突,每一个原生组件被称为一个模块。
LOCAL_MODULE变量用来给这些模块设定一个唯一的名称。下面的代码将该模块的名称设为hello-jni:
- LOCAL_MODULE := hello-jni
因为模块名称也被用于给构建过程所生成的文件命名,所以构建系统给该文件添加了适当的前缀和后缀。本例中,hello-jni模块会生成一个共享库文件且构建系统会将它命名为libhello-jni.so。
用LOCAL_SRC_FILES变量定义用来建立和组装这个模块的源文件列表。
- LOCAL_SRC_FILES := hello-jni.c
这里,hello-jni模块只由一个源文件生成,而LOCAL_SRC_FILES变量可以包含用空格分开的多个源文件名。
至此,Android.mk文件中定义的构建系统变量简单描述了原生项目。编译和生成实际模块的构建系统还需要包含合适的构建系统片段,具体需要包含哪些片段取决于想要生成模块的类型。
1. 构建共享库
为了建立可供主应用程序使用的模块,必须将该模块变成共享库。Android NDK构建系统将BUILD_SHARED_LIBRARY变量设置成build-shared-library.mk文件的保存位置。该Makefile片段包含了将源文件构建和组装成共享库的必要过程:
- include $(BUILD_SHARED_LIBRARY)
hello-jni是一个简单的模块;然而,除非你的模块需要特殊处理,否则Android.mk文档将会包含一模一样的流程和指令。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码

51CTO读书频道活动讨论群:342347198