安卓

首页 » 常识 » 诊断 » NDK开发之静态库
TUhjnbcbe - 2021/7/26 9:02:00

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放入安卓虚拟机中运行。

更多精彩

扫码

1
查看完整版本: NDK开发之静态库