Android NDK种的动态库和静态库就是linux下的动态库和静态库,因为NDK的开发可以理解从基于Linux的开发。
在平时工作中我们经常把一些常用的函数或者功能封装为一个个库供给别人使用,java开发我们可以封装为jar包提供
给别人用,安卓平台后来可以打包成aar包,同样的,C/C++中我们封装的功能或者函数可以通过静态库或者动态库
的方式提供给别人使用。
Linux平台静态库以.a结尾,而动态库以.so结尾。
要分析链接库首先要分析交叉编译
2.1 什么是交叉编译?
交叉编译就是在A平台编译出可以在B平台执行的文件,对于我们安卓开发者来说交叉编译就是在window或者mac或
者linux系统上编译出可在安卓系统上运行的可执行文件,什么时候需要用到交叉编译呢?音视频开发基本都会用到
ffffmpeg,opengl es等三方库,这时我们就需要在window或者mac或者linux系统上编译出可在安卓系统执行的文
件,这里可编译出静态库或者动态库使用,这时候就会用到交叉编译。
交叉编译的目的很清楚,就是编译出除了自己平台意外其他平台可以用的库的过程。那么在Android 平台的代码,
由于Android平台是基于linux,因此很多Android 中可以运行的库就是在linux中编译的,或者是在mac上面编
译,而在windows上面编译就比较难了。那么到底什么是动态库和静态库呢?
2.2 动态库和静态库(共享库)
2.2.1 静态库
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标
代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译
进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
2.2.2 动态库
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序
执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整
合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并
不影响你的程序,所以动态函数库的升级比较方便
静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大;动态库(共享库)的代码在可执行程序运行时才载
入内存,在编译过程中仅简单的引用,因此代码体积比较小。
2.3 Android如何配置cmakelist.txt 配置编译动态库和静态库呢?
add_library(jinInterface SHARED library.c library.h)// SHARED 表示是动态库
add_library(jinInterface STATIC library.c library.h)// STATIC 表示是静态库
ADD_LIBRARY(...)
语法:ADD_LIBRARY(libname [SHARED|STATIC] )
上面的表达式等同于:
set(LIB_SRC library.c library.h)
add_library(jinInterface SHARED ${LIB_SRC})