[Android]Android.mk学习(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ouyangshima/article/details/83184964

import-module的功能

导入外部模块的.mk文件 ,和 include基本一样。
概念上的区别是include导入的是由我们自己写的.mk。而import-module导入的是外部库、外部模块提供的.mk。
import-module的使用:$(call import-module,相对路径)
include的路径是.mk文件的绝对路径。
而import是设置的路径指定到模块的.mk所在目录,是相对于NDK_MODULE_PATH中的路径列表的相对路径。

NDK_MODULE_PATH的配置

NDK_MODULE_PATH是一个很重要的变量,当android.mk中使用了$(call import-module,XXX)函数引入外部库文件时会用到,用以指示该往哪里去找这个文件

  1. NDK_MODULE_PATH 是一个环境变量,不是android.mk中设置的变量。
  2. NDK_MODULE_PATH多个路径用冒号分割。不是分号!且整个字符串中间不能有空格。格式不正确也会报错上面的错误的。
  3. 在import语句之前加入,$(call import-add-path,$(LOCAL_PATH)/platform/third_party/android/prebuilt) 将一个新的路径加入NDK_MODULE_PATH变量。

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。
不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。

include $(CLEAR_VARS)

Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始以include $(BUILD_XXX)结束。
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

  1. include $(BUILD_STATIC_LIBRARY)表示编译成静态库
  2. include $(BUILD_SHARED_LIBRARY)表示编译成动态库。
  3. include $(BUILD_EXECUTABLE)表示编译成可执行程序

设置需要链接的动态库

LOCAL_LDLIBS:=-Llibspath -lxxx -lyyy ... #libspath是库所在路径,xxx和yyy是库

LOCAL_STATIC_LIBRARIES:

要链接到本模块的静态库list。

all-subdir-makefiles:

返回一个列表,包含'my-dir'中所有子目录中的Android.mk。   
例如: 结构如下:sources/foo/Android.mk   sources/foo/lib1/Android.mk   sources/foo/lib2/Android.mk
在If sources/foo/Android.mk 中, include $(call all-subdir-makefiles)  那则自动include 了sources/foo/lib1/Android.mk and sources/foo/lib2/Android.mk

LOCAL_C_INCLUDES

可选变量,表示头文件的搜索路径。默认的头文件的搜索路径是LOCAL_PATH目录。
在编写android.mk的过程中,免不了要修改LOCAL_C_INCLUDES来设置头文件的include目录, 一般写成这样

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
                    $(LOCAL_PATH)/../../Classes/game \
                    $(LOCAL_PATH)/../../Classes/logic \
                    $(LOCAL_PATH)/../../Classes/view                    
有一个目录就要写一行, 实在繁琐, 有没有写法可以把源码目录下的所有子目录都引入呢, 看下面
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_C_INCLUDES += $(shell ls -FR $(LOCAL_C_INCLUDES) | grep $(LOCAL_PATH)/$ )
LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES:$(LOCAL_PATH)/%:=$(LOCAL_PATH)/%)

即可把$(LOCAL_PATH)/../../Classes目录和子目录全部包含进来

LOCAL_CPP_EXTENSION

这是一个可选变量, 用来指定C++代码文件的扩展名,默认是'.cpp',但是可以改变它,比如:LOCAL_CPP_EXTENSION := .cxx

LOCAL_CFLAGS

  • 可选的编译器选项,在编译 C 代码文件的时候使用。这可能是有用的,指定一个附加的包含路径(相对于NDK的顶层目录),宏定义,或者编译选项。
  • LOCAL_CXXFLAGS:  与 LOCAL_CFLAGS同理,针对 C++源文件。
  • LOCAL_CPPFLAGS:  与 LOCAL_CFLAGS同理,但是对 C 和 C++ source files都适用。

[Android]Android.mk学习

猜你喜欢

转载自blog.csdn.net/ouyangshima/article/details/83184964
今日推荐