在Linux下,可以通过Makefile来对源码工程进行管理,Android.mk文件是Makefile的一小部分,它用来对Android程序进行编译。Android.mk文件中描述了哪些C文件将被编译且指明了如何编译。Android.mk文件用来告知NDK Build 系统关于Source的信息。
1、编译可执行程序
2、编译动态库或静态库
3、预编译文件(APK或Java库)
以上三种是Android.mk的主要用法,我们写mk文件时也就是以上三种目的。
首先看一个最简单的Android.mk的例子:
讲解:
每个Android.mk文件必须以定义 LOCAL_PATH 为开始。它用于在开发tree中查找源文件。
宏 my-dir 由Build System提供。返回包含Android.mk的目录路径。
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理 LOCAL_PATH .
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
LOCAL_MODULE 模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so.
但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。
LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。
不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。
BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。
它负责收集自从上次调用include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。
BUILD_STATIC_LIBRARY:编译为静态库。
BUILD_SHARED_LIBRARY :编译为动态库
BUILD_EXECUTABLE:编译为Native C可执行程序
BUILD_PACKAGE(既可以编apk,也可以编资源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true)
BUILD_JAVA_LIBRARY(Java共享库)
BUILD_STATIC_JAVA_LIBRARY(java静态库)
Android源码中有大量的mk文件,Android系统的编译就是靠着这些mk文件的,所以学好是非常有必要的哦!
Android NDK的例子中,每个需要编译的c/c++文件都是清晰的列在Android.mk文件中LOCAL_SRC_FILES变量后面的,如果文件很多,这样就不好办了。我们可以使用通配符来解决大量的源文件添加到Android.mk的问题:
第1行是使用GNU Make函数wildcard来查找所有目录下面的文件,这里查找的是"当前项目路径/foo"目录下面的所有的“.c”文件,
第2行会把所有找到的文件名中的$(LOCLA_PATH)路径给去掉,只剩下foo/*.c类似的名字。
MY_FILES := $(wildcard $(LOCAL_PATH)/foo/*.c)
MY_FILES := $(MY_FILES:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(MY_FILES)
1.首先,在 Android.mk文件中需要加入:LOCAL_LDLIBS := -llog2. 其次,包含如下库文件 #include <android/log.h>
3. 使用方法示例__android_log_print(ANDROID_LOG_INFO, "CDib::Attach", "--------%d,%d,%d,this->linebytes=%d\n",linebytes,width,height,this->linebytes)//按此形式打印变量方便调用起见,可以使用宏定义#define LOGI(msg) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, msg)#define LOGE(msg) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, msg)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)