NDK开发之静态库
01
静态库的由来
首先编写一个程序,程序中用到三个函数,分别为这三个函数创建三个源文件和一个头文件。
头文件命名为mou.h。
voidmy_strcpy();voidmy_strcat();
函数my_strcpy,文件命名为mou1.c。
voidmy_strcpy(){puts("my_strcpy");}
函数my_strcat,文件命名为mou2.c。
voidmy_strcat(){puts("my_strcat");}
函数main,文件命名为test.c。
#includestdio.h#include"mou.h"intmain(intargc,char*argv[]){my_strcpy();my_strcat();printf("test\n");return0;}
便于自动化编译链接后生成可执行文件Hello,将编译链接操作写入Android.mk中,利用ndk-build执行。
LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=HelloLOCAL_SRC_FILES:=mou1.cmou2.ctest.cLOCAL_CFLAGS+=-O0include$(BUILD_EXECUTABLE)
编译执行后,成功生成可执行文件Hello。
编译后的obj文件,放在目录下的obj\local\x86\objs\Hello中。
假设现在想要上架一款新软件,仍然需要mou1.c和mou2.c中的两个函数。我们可以重新编译mou1.c和mou2.c,再进行链接。
上一种假设只是在实验中,而再假设,公司现在想要上架一个大型新软件,需要用到之前的个已经写好的函数。如果把这个写好的函数重新编译再链接,将消耗大量的时间和精力。所以为了节省资源,把之前个已经写好的函数编译后生成的obj文件,拿入新软件工程中直接进行链接,省去编译的时间。
在这基础上,再假设,需要用到之前个已经写好的函数的其中个,即使拿到obj直接链接,也要手动敲入个obj文件,人们容易敲错,敲多,敲少,也是一个极大的隐患。
这时便提出了静态库思想,假设将这个obj文件打包,再链接时链接器根据工程的需要,自动识别需要哪个函数就链接哪个函数。这样既保证了工程发布的速度,也保证了链接的准确性。
02
创建静态库
在NDK开发工具包中toolchains目录下,提供了obj打包工具”cpu架构-linux-android-ar”,以x86平台为例,选择obj打包工具为i-linux-android-ar.exe,常用参数为:
r替换现有文件或插入新的文件到存档
d从存档中删除文件
t显示存档内容
假设现在想要上架一款新软件,仍然需要mou1.c和mou2.c中的两个函数。主函数已经写好,命名为newSoft.c
#includestdio.h#include"mou.h"intmain(intargc,char*argv[]){my_strcpy();my_strcat();printf("newSoftware\n");return0;}
只需要将mou1.c和mou2.c生成的obj文件进行打包,链接即可,而无需重新编译。
ndk下规定打包的obj命名为linxxx.a,将mou1.o和mou2.o打包,cmd下执行命令:
i-linux-android-ar.exerlibmou.amou1.omou2.o
查看打包后的libmou.a内容,cmd下执行命令:
i-linux-android-ar.exetlibmou.a
03
链接静态库
将做好的libmou.a进行链接即可,为了链接生成可执行文件操作方便,将操作写入Android.mk中。加入第三方静态库,并指定静态库为mou。
LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#第三方静态库LOCAL_MODULE:=mouLOCAL_SRC_FILES:=libmou.ainclude$(PREBUILT_STATIC_LIBRARY)include$(CLEAR_VARS)LOCAL_MODULE:=HelloLOCAL_SRC_FILES:=newSoftware.cLOCAL_CFLAGS+=-O0LOCAL_LDLIBS:=-llog-lcLOCAL_STATIC_LIBRARIES+=mouinclude$(BUILD_EXECUTABLE)
利用ndk-build执行。并将生成的可执行文件Hello放入安卓虚拟机中运行。
更多精彩
扫码