关于如何在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文件内容:
3.添加.c和.h文件:
适当添加几个.h和.c文件:
注意:这里test1.h和test2.h我用了<>,是因为我在Android.mk中,添加了
4.执行mm命令:
这样就完美编译了该工程。
情况2:在一个C工程中同时编译出多个可执行文件、动态库、静态库时
1.想一次编译输出多个文件,只需要再增加Android.mk的内容即可:
可见,这样就分别生成了想要的可执行文件、动态库、静态库。
情况3:在一个C工程中同时编译时引入相关的android系统库时
1.先修改下我的test_android_mk.c,让它引用一个系统库里的函数。
2.然后,在修改前面的Android.mk:
成功编译,引入了系统库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:
3.在external/test_android_mk目录下执行mm命令:
这样,就利用上了第三方库(动态库、静态库),并编译出了可执行文件!!
下面来看下整个C工程目录,如下所示,这样基本就完美了!
博客中涉及到的代码,我分享到了我的资源里... 有需要可下载...
情况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源码目录中建立自己的C工程,并用mm命令单独进行该C工程模块的编译,以及Android.mk的使用介绍(1)
- Android如何获得系统(system)权限以及MM命令模块介绍
- android如何把apk的工程代码放到源码目录下编译
- Android: m, mm以及mmm编译命令以及make snod的使用
- 关于Android动画插值器的简单介绍以及如何自定义自己的插值器
- 【Eclipse】eclipse如何将User Libraries中建立的文件夹目录引入到自己的工程中使用
- 如何将Android 源码中编译出的apk进行自己的签名
- Android 源码编译经验分享, 以及如何使用Android studio 阅读整个源码
- Android: m, mm以及mmm编译命令以及make snod的使用
- 编译android源码m、mm、mmm命令的使用
- Android: m, mm以及mmm编译命令以及make snod的使用
- 如何编译Android源码的单独模块
- android 源码的m、mm、mmm编译命令的使用与重新打包android系统镜像文件。
- android的m、mm、mmm编译命令的使用
- android 模块编译,mm 命令
- android开发环境建立以及开发工具的使用--怎样使用eclipse来开发android源码
- objective-c中对象所有权的内存管理(关于set,get方法),以及如何使用@property来进行简易操作(九)
- android模块编译,mm命令, 模块编译
- 如何用mm、mmm编译android中的模块
- Android源码下载以及编译自己的ROM