共享库(.so文件)

来源:互联网 发布:linux 虚拟化技术 编辑:程序博客网 时间:2024/06/05 05:11

库文件:

        程序编译一般需经预处理、编译、汇编和链接几个步骤。在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件。库文件中的函数可以通过连接程序与应用程序进行连接。这样就不必在每次开发程序时都对这些通用的函数进行编译了。

linux下的库有两种:静态库和共享库(动态库)。

      静态库:是一些目标文件的集合,以.a结尾。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。

      优点:可执行文件中包含了库代码的一份完整拷贝。即使你所使用的库升级了、或者被误删除了,你生成的这个可执行文件仍然可以使用。

      缺点:

      ①被多次使用就会有多份冗余拷贝。

      ②生成的可执行文件比较大,占用较多的内存。

      ⑵共享库:共享库以.so结尾。在编译时,只是简单地指定需要使用的库函数。然后在程序开始启动运行的时候,动态地加载所需模块。动态库是共享库的另一种变化形式。动态库也是在程序运行时载入,但与共享库不同的是,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。

      优点:

      ①系统只需载入一次共享库,不同的程序可以得到内存中相同的共享库的副本,因此节省了很多内存。

      ②没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。

      ③大大简化了代码维护,当一些错误被修正或一些特性被添加时,用户只需要获得更新的库并安装。

      缺点:库文件升级以后可能会导致错误;如果没有安装相应的库,某些应用程序无法使用(找不到库文件)。

     对比了几种库文件之后,我们可以看出共享库具有一定的优势,而so文件就是共享库的一种。ELF格式的可执行文件使得共享库能够比较容易地实现。

so文件的优势

    so(shared object)文件为共享库,用于动态连接,是C或C++编译出来的。使用得当,可以节约系统资源,加快运行速度,简化代码升级。

so文件的编写

      so文件的生成主要是由一个头文件和若干个源文件经过GCC编译转化为一个共享库(.so文件)。其中我们的公共代码就以.c文件的形式编写在源文件中。在eclipse(安装了NDK)中可以自动生成so文件,其原理也是经过GCC编译来生成的,即在eclipse中也需要安装MinGW(由GNU binary utilitiesGCCGDB组成)。

      生成so文件之后,将其复制到工程的libs\armeabi目录下。由eclipse生成的so文件直接在此目录下。在android工程中,可新建一个java类,该类所在package的名称和class名称都应与.so文件中函数签名提示的一致,在这个类中加入native方法的声明,并使用loadLibrary加载该so文件。这样在别处就可以用这个wrapper调用so库中的函数了。

so文件的性能分析

      一个共享库可供同一系统中的多个应用程序使用。共享库的性能会影响使用此共享库的应用程序,并且会影响整个系统。在代码中加入so文件主要有以下优势:

      ⑴so文件调用的是linux层的代码,在程序运行时,它是运行在底层的。这样可以减轻java虚拟机的负担,加快应用运行速度。

      ⑵so文件是一种可执行代码的二进制形式,可以被操作系统载入内存执行。在事件响应时,加快响应处理速度。

      ⑶将代码打包成so文件供android应用调用,减少了应用代码的体积,同时也实现了代码的模块化。

      ⑷加入so文件机制,版本升级时,只需要根据需求修改so文件或应用部分代码,简化了升级。

0 0
原创粉丝点击