加载中…
个人资料
青青的草原洁白的云
青青的草原洁白的云
  • 博客等级:
  • 博客积分:0
  • 博客访问:4,808
  • 关注人气:29
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Android : 编译动态库时如何引入静态库

(2016-08-31 15:18:40)
标签:

android

本地库

native

分类: Android本地库
Android : 编译动态库时如何引入第三方静态库
Aoyousatuo Zhao
http://blog.sina.com.cn/aoyousatuo

      由于工作需要,我们需要在framework中增加自己的动态库,并且动态库需要使用合作方提供的第三方静态库。但是在引入静态库编译动态库时总是提示失败。具体如下:
1. 文件列表
http://s7/mw690/001ojZj0zy74tPamdZse6&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />
说明: Android.mk是编译配置文件,稍后具体说明;
           test.cpp是编译动态库的源文件,内容很简单,就是一个函数里面分别调用静态库中的函数。本例的主要目的是验证动态库引用第三方库的方法,具体库函数的功能基本忽略。
           third_lib.a是第三方静态库文件;
           third_lib.h是第三方静态库输出函数的头文件

我们可以通过命令 mn -s third_lib.a来查看静态库的大致情况:
http://s2/mw690/001ojZj0zy74tQbvpwlb1&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />
可以看出,静态库的源文件也叫test, 它提供了两个函数xdcodec_encode1和xdcodec_encode_init1。

我们再来看一下编译配置文件的内容:
http://s11/mw690/001ojZj0zy74tQMo5wCfa&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />
可以看出这个配置文件的内容主要分为两部分,第一部分预编译静态库,这一过程不触发构建过程,仅仅是重起了个名字,并且将该库拷贝到某个路径下(具体可以参看另一篇文章,NDK使用二进制库的方法);第二部分是用于编译动态本地库,可以看出它通过LOCAL_STATIC_LIBRARIES关键字引入了之前预编译的静态库。

这一系列似乎没有什么问题,但是我们编译的时候会报一系列错误,最终会提示如下错误:
http://s4/mw690/001ojZj0zy74tSktl8723&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />
我们可以看出应该是去third_side_lib_intermediates中去找相关文件了,但是我们可以发现这个文件夹并不存在,所以导致错误。导致错误的原因应该和编译的整体环境有关,也就是说静态库的预编译在这个编译环境下并不会将静态库拷贝到上面的路径中。那么如何解决呢?

方法1 :
       人为建立上面的文件夹并将静态库拷入;

方法2 :
      就是通过编译配置来做上面的动作。具体如下:
1. 将动态库的编译部分和静态库的编译部分分开;
2. 在工作目录下建立一个lib文件夹(必须是这个名字),将第三方的静态库拷贝进去,并且增加一个编译配置文件Android.mk,具体内容如下:
http://s10/mw690/001ojZj0zy74tU2TaFXf9&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />
这个编译配置文件就是要在obj下生成中间文件,供其他地方使用。
文件列表如下:
http://s15/mw690/001ojZj0zy74tWImwDc0e&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />

3. 在工作目录下建立一个文件夹,并且将生成动态库的相关文件全部拷贝进去。这里我们起的名字是src,当然也可以起其他名字。Android.mk内容如下:
http://s3/mw690/001ojZj0zy74tXeYWno72&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />
这里只要直接引入第三方库就可以了。
文件列表如下:
http://s8/mw690/001ojZj0zy74tXiRkA767&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />
third_lib.h是静态库的头文件,test.cpp很简单,就是一个函数里面顺序调了一下静态库里开放的函数,内容如下:
http://s6/mw690/001ojZj0zy74tXOk7Jz85&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />

3. 工作目录下增加一个编译配置文件Android.mk,作用就是查找工作目录下所有的子目录中的Android.mk来编译。Android.mk的内容如下:
http://s8/mw690/001ojZj0zy74tXP2wWb97&690编译动态库时如何引入静态库" TITLE="Android 编译动态库时如何引入静态库" />
好,工作都做完了,下面进入工作目录mm -B 试一下,可以顺利编译成功。













0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有