此篇文章介绍在Android NDK开发中静态库和动态库的知识,主要是编译C/C++库和调用C/C++库的方法和场景。json
本文第三部分是为了接下来的几篇文章作铺垫,也是本系列中最重要的几篇。函数
本文目录:测试
1.静态库介绍code
2.动态库介绍开发
3.总结静态库和动态库的几种编译和调用场景源码
静态库:编译
1.全名是静态连接库(Static Library),后缀是
.a
,例如libcjson.a
class2.调用静态库的程序在编译时会将静态库所有编译到目标代码中,因此程序运行环境中再也不须要静态库,而且静态库文件体积较大程序
3.调用静态库时,若是对静态库中的函数内容进行改变,不只须要从新编译静态库,还须要对调用静态库的程序从新编译,将静态库编译到目标代码中。方法
动态库:
1.全名是动态连接库(Shared Library),后缀是
.so
,例如libcjson.so
2.调用动态库的程序在编译时不能将动态库编译到目标代码中,程序执行到相关函数时才会连接该动态库对应的函数,因此程序运行环境中必须提供动态库,而且动态库文件体积较小
3.调用动态库时,若是对动态库中的函数内容进行改变,只须要从新编译动态库,不须要对调用动态库的程序从新编译,即不须要干预目标代码,直接用新的动态库替换掉旧的动态库便可
在通过屡次NDK测试与验证后,总结了静态库和动态库的几种编译和使用场景,整体能够分为3种状况:
1.将C/C++的源码直接编译成静态库,只能提供给底层调用。
注:比较适用于将第三方开源库编译成静态库,也能够将本身写的源码编译成静态库,给本身或其余人的底层调用。
2.将C/C++的源码直接编译成动态库,不须要封装JNI层,提供给底层调用。
注:比较适用于将本身写的源码编译成动态库,也能够将第三方开源库编译成动态库,给本身或其余人的底层调用。
3.将C/C++的源码进行JNI层封装后,编译成动态库,提供给上层调用。
注:比较适用于将本身写的源码进行JNI封装后,连同jar包一块儿,给本身或其余人的上层调用。
接下来的文章会详细讲解静态库和动态库的编译方法和调用场景。