Android NDK秘籍--浅析静态库和动态库

3,005

此篇文章介绍在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包一起,给自己或其他人的上层调用。

接下来的文章会详细讲解静态库和动态库的编译方法和调用场景。