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

标签:
android本地库native |
分类: Android本地库 |
Android : 编译动态库时如何引入第三方静态库
Aoyousatuo Zhao
http://blog.sina.com.cn/aoyousatuo
1. 文件列表
http://s7/mw690/001ojZj0zy74tPamdZse6&690: 编译动态库时如何引入静态库" TITLE="Android : 编译动态库时如何引入静态库" />
说明: Android.mk是编译配置文件,稍后具体说明;
说明: Android.mk是编译配置文件,稍后具体说明;
我们可以通过命令 mn -s
third_lib.a来查看静态库的大致情况:
http://s2/mw690/001ojZj0zy74tQbvpwlb1&690: 编译动态库时如何引入静态库" TITLE="Android : 编译动态库时如何引入静态库" />
可以看出,静态库的源文件也叫test, 它提供了两个函数xdcodec_encode1和xdcodec_encode_init1。
可以看出,静态库的源文件也叫test, 它提供了两个函数xdcodec_encode1和xdcodec_encode_init1。
我们再来看一下编译配置文件的内容:
http://s11/mw690/001ojZj0zy74tQMo5wCfa&690: 编译动态库时如何引入静态库" TITLE="Android : 编译动态库时如何引入静态库" />
可以看出这个配置文件的内容主要分为两部分,第一部分预编译静态库,这一过程不触发构建过程,仅仅是重起了个名字,并且将该库拷贝到某个路径下(具体可以参看另一篇文章,NDK使用二进制库的方法);第二部分是用于编译动态本地库,可以看出它通过LOCAL_STATIC_LIBRARIES关键字引入了之前预编译的静态库。
可以看出这个配置文件的内容主要分为两部分,第一部分预编译静态库,这一过程不触发构建过程,仅仅是重起了个名字,并且将该库拷贝到某个路径下(具体可以参看另一篇文章,NDK使用二进制库的方法);第二部分是用于编译动态本地库,可以看出它通过LOCAL_STATIC_LIBRARIES关键字引入了之前预编译的静态库。
这一系列似乎没有什么问题,但是我们编译的时候会报一系列错误,最终会提示如下错误:
http://s4/mw690/001ojZj0zy74tSktl8723&690: 编译动态库时如何引入静态库" TITLE="Android : 编译动态库时如何引入静态库" />
我们可以看出应该是去third_side_lib_intermediates中去找相关文件了,但是我们可以发现这个文件夹并不存在,所以导致错误。导致错误的原因应该和编译的整体环境有关,也就是说静态库的预编译在这个编译环境下并不会将静态库拷贝到上面的路径中。那么如何解决呢?
我们可以看出应该是去third_side_lib_intermediates中去找相关文件了,但是我们可以发现这个文件夹并不存在,所以导致错误。导致错误的原因应该和编译的整体环境有关,也就是说静态库的预编译在这个编译环境下并不会将静态库拷贝到上面的路径中。那么如何解决呢?
方法1 :
方法2 :
1.
将动态库的编译部分和静态库的编译部分分开;
2.
在工作目录下建立一个lib文件夹(必须是这个名字),将第三方的静态库拷贝进去,并且增加一个编译配置文件Android.mk,具体内容如下:
http://s10/mw690/001ojZj0zy74tU2TaFXf9&690: 编译动态库时如何引入静态库" TITLE="Android : 编译动态库时如何引入静态库" />
这个编译配置文件就是要在obj下生成中间文件,供其他地方使用。
这个编译配置文件就是要在obj下生成中间文件,供其他地方使用。
文件列表如下:
3.
在工作目录下建立一个文件夹,并且将生成动态库的相关文件全部拷贝进去。这里我们起的名字是src,当然也可以起其他名字。Android.mk内容如下:
http://s3/mw690/001ojZj0zy74tXeYWno72&690: 编译动态库时如何引入静态库" TITLE="Android : 编译动态库时如何引入静态库" />
这里只要直接引入第三方库就可以了。
这里只要直接引入第三方库就可以了。
文件列表如下:
http://s8/mw690/001ojZj0zy74tXiRkA767&690: 编译动态库时如何引入静态库" TITLE="Android : 编译动态库时如何引入静态库" />
third_lib.h是静态库的头文件,test.cpp很简单,就是一个函数里面顺序调了一下静态库里开放的函数,内容如下:
third_lib.h是静态库的头文件,test.cpp很简单,就是一个函数里面顺序调了一下静态库里开放的函数,内容如下:
3.
工作目录下增加一个编译配置文件Android.mk,作用就是查找工作目录下所有的子目录中的Android.mk来编译。Android.mk的内容如下:
http://s8/mw690/001ojZj0zy74tXP2wWb97&690: 编译动态库时如何引入静态库" TITLE="Android : 编译动态库时如何引入静态库" />
好,工作都做完了,下面进入工作目录mm -B 试一下,可以顺利编译成功。
好,工作都做完了,下面进入工作目录mm -B 试一下,可以顺利编译成功。