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