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

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

2017-09-24 10:17 1376 查看
    我在上一篇文章《关于如何在Android源码目录中建立自己的C工程,并用mm命令单独进行该C工程模块的编译,以及Android.mk的使用介绍(1)》中介绍了Android.mk的基本使用。当时C工程中只有一个.c文件,一个.c文件确实不好意思称之为C工程。所以,下面分几种情况来介绍Android.mk的编写:

情况1:当C工程中有多个.c文件需要编译时

    1.首先还是在Android源码目录的external中建立C工程文件夹test_android_mk,并在其中添加bin文件夹、src文件夹,再添加一些.h和.c文件,工程目录结构如图所示:



    2.修改Android.mk文件内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test_android_mk                           #输出文件的名称
LOCAL_MODULE_PATH :=$(LOCAL_PATH)/bin                     #输出文件的路径
#LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc                     #引用头文件的目录
LOCAL_SRC_FILES :=$(call all-c-files-under)               #利用系统提供的脚本函数all-c,将工程目录下的所有.c文件引入,此脚本函数定义在build/core里的某个.sh文件中。
#include $(BUILD_STATIC_LIBRARY)
#include $(BUILD_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)                               #编译成可执行文件


    3.添加.c和.h文件:

适当添加几个.h和.c文件:







注意:这里test1.h和test2.h我用了<>,是因为我在Android.mk中,添加了

LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
所以没问题的,Android.mk会自动找到它们。





    4.执行mm命令:



这样就完美编译了该工程。

情况2:在一个C工程中同时编译出多个可执行文件、动态库、静态库时

   1.想一次编译输出多个文件,只需要再增加Android.mk的内容即可:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test_android_mk_elf
LOCAL_MODULE_PATH :=$(LOCAL_PATH)/bin
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
LOCAL_SRC_FILES :=$(call all-c-files-under)  #用test1.、test2.c、test_android_mk.c编译成可执行文件test_android_mk_elf
include $(BUILD_EXECUTABLE)

include $(CLEAR_VARS)
LOCAL_MODULE := libtest1
LOCAL_MODULE_PATH :=$(LOCAL_PATH)/bin
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
LOCAL_SRC_FILES :=/src/test1.c               #用test1.c编译成libtest1.a
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libtest2
LOCAL_MODULE_PATH :=$(LOCAL_PATH)/bin
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
LOCAL_SRC_FILES :=/src/test2.c               #用test2.c编译成libtest2.so
include $(BUILD_SHARED_LIBRARY)
    2.再执行mm命令:





    可见,这样就分别生成了想要的可执行文件、动态库、静态库。

情况3:在一个C工程中同时编译时引入相关的android系统库时

    1.先修改下我的test_android_mk.c,让它引用一个系统库里的函数。



    2.然后,在修改前面的Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test_android_mk_elf
LOCAL_SHARED_LIBRARIES += liblog                     #在这里利用LOCAL_SHARED_LIBRARIES += libxxx来添加所引入的库,即可。
LOCAL_MODULE_PATH :=$(LOCAL_PATH)/bin
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
LOCAL_SRC_FILES :=$(call all-c-files-under)
include $(BUILD_EXECUTABLE)
    3.在external/test_android_mk目录下执行mm命令:



    成功编译,引入了系统库liblog.so,那么这个库到底在什么位置呢?

在安卓系统源码目录的out中,执行find ./ -name liblog.so命令:



    得知有以上这几个liblog.so,我通过分别单独修改这几个库名字,然后在执行mm命令,看看删掉哪个库后mm执行报错,就知道编译时引入的是哪个库了...

    最后知道所用的这个库是:out/target/product/rk3288/obj/lib/liblog.so,这样可知此时编译时所使用的库并非导入到system中的库。

    到此,引入android系统库的方法,就学会了。

情况4:在一个C工程中同时引入第三方库(.a 库 和 .so库)

    1.现在把test1编译成.a库,把test2.c编译成so库,在编译test_android_mk.c时,以第三方库的形式引入libtest1.a和libtest2.so,修改下Android.mk:

LOCAL_PATH := $(call my-dir)

#将test1.c生成静态库libtest1.a
include $(CLEAR_VARS)
LOCAL_MODULE := libtest1
LOCAL_MODULE_
a24a
PATH :=$(LOCAL_PATH)/lib
#LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc  
LOCAL_SRC_FILES :=src/test1.c
include $(BUILD_STATIC_LIBRARY)

#将test2.c生成动态库libtest2.so
include $(CLEAR_VARS)
LOCAL_MODULE := libtest2
LOCAL_MODULE_PATH :=$(LOCAL_PATH)/lib
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
LOCAL_SRC_FILES :=src/test2.c
include $(BUILD_SHARED_LIBRARY)

#编译可执行文件test_android_mk_elf
include $(CLEAR_VARS)
LOCAL_MODULE := test_android_mk_elf
LOCAL_SHARED_LIBRARIES += liblog                        #加入android系统库的方式
LOCAL_MODULE_PATH :=$(LOCAL_PATH)/bin
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/inc
LOCAL_LDFLAGS := -L./lib/ -ltest2                       #加入第三方动态库的方式
LOCAL_LDFLAGS +=$(LOCAL_PATH)/lib/libtest1.a            #加入第三方静态库的方式
LOCAL_SRC_FILES :=src/test_android_mk.c
#LOCAL_SRC_FILES :=$(call all-c-files-under)
include $(BUILD_EXECUTABLE)
    2.修改下test_android_mk.c,如下:



    3.在external/test_android_mk目录下执行mm命令:



    这样,就利用上了第三方库(动态库、静态库),并编译出了可执行文件!!

    下面来看下整个C工程目录,如下所示,这样基本就完美了!



博客中涉及到的代码,我分享到了我的资源里... 有需要可下载...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 脚本 mm Android.mk