您的位置:首页 > 移动开发 > Android开发

关于如何在Android源码目录中建立自己的C工程,并用mm命令单独进行该C工程模块的编译,以及Android.mk的使用介绍(1)

2017-09-24 08:00 1071 查看
1.学习前,先实践一下Android.mk的使用!

    前提:是要在完整编译完Android源码(source build/envsetup.sh,lunch n,make update,make -j8)。因为没有不完整编译Android源码,在执行mmm或mm命令时会报错。如下图:



××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

下面言归正传~.~

    为了测试下在mmm和mm命令,我在我的Android源码目录(r970)的external目录下创建了test_android_mk文件夹,并Touch 了Android.mk和test_android_mk.c两个文件:



Android.mk如下:



include $(BUILD_STATIC_LIBRARY)      
是为了成静态库文件

include $(BUILD_SHARED_LIBRARY)     是为了动态库文件

include $(BUILD_EXECUTABLE)             是为了生成可执行文件

我这里是为了生成可执行文件,所以注释了前两条。

test_android_mk.c如下:



然后,进入到external/test_android_mk/目录下执行mm指令:



成功编译出可执行文件test_android_mk,其所在目录为:

out/target/product/rk3288/obj/EXECUTABLES/test_android_mk_intermediates/test_android_mk

2.Android.mk基础设置

先来解释Android.mk里的内容:

LOCAL_PATH := $(call my-dir) #定义当前模块的相对路径
include $(CLEAR_VARS) #清除LOCAL_PATH以外的,所有的以LOCAL_开头的变量
LOCAL_MODULE := test_android_mk #存入编译后的模块名称
#LOCAL_MODULE_PATH :=$(LOCAL_PATH) #若加入这一行,则编译出的文件会输出到当前路径下,而非out目录。
LOCAL_SRC_FILES := test_android_mk.c #存入原文件路径(若是多个c文件,用“\+回车”,链接更多c文件)
#LOCAL_C_INCLUDES := #存入需要包含的头文件路径
#LOCAL_STATIC_LIBRARYS := #存入所需链接的静态库的名称

#LOCAL_SHARED_LIBRARYS := #存入所需链接的动态库的名称
#include $(BUILD_STATIC_LIBRARY)  #编译成静态库
#include $(BUILD_SHARED_LIBRARY)  #编译成动态库
include $(BUILD_EXECUTABLE)  #编译成可执行文件


可执行文件,静态库,动态库的生成目录为:

    out/target/product/*/obj/EXECUTABLE

    out/target/product/*/obj/STATIC_LIBRARY

    out/target/product/*/obj/SHARED_LIBRARY

    

其目标的文件夹分别为每个模块中LOCAL_MODULE所定义的名字:

    XXX_intermediates

    XXX_shared_intermediates

    XXX_static_intermediates

可参考我在1中生成的可执行文件的路径

(out/target/product/rk3288/obj/EXECUTABLES/test_android_mk_intermediates/test_android_mk)

 

所以综合上面的模板,Android.mk的每一个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束。 

    在Android.mk文件中,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定目标的安装路径。不同的文件系统路径用以下的宏进行选择。

    TARGET_ROOT_OUT:表示根文件系统。

    TARGET_OUT:表示system文件系统。

    TARGET_OUT_DATA:表示data文件系统。

3.稍微深入解析下Android.mk机制

    研究下Android.mk里的这些变量和脚本函数是什么时候定义的呢?

    在build/core/目录下有一大堆的.mk文件,这些文件中就定义了各种脚本函数,以及Android.mk所需的各种变量。比如打开其中的definitions.mk文件,其中就有my-dir这个脚本函数的定义:



再比如,这个CLEAR_VARS,BUILD_STATIC_LIBRARY,BUILD_STATIC_LIBRARY又定义在什么地方呢?

它在build/core/目录下的clear_vars.mk中:


    所以,若想详细研究Android.mkj机制,需要自己一层层的研究build/core/目录下的这些.mk文件,我就不多说了,大家以自己研究。

    到此,就可以简单编译一个C工程了....  未完待续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 脚本