Android导入第三方静态库.a编译成动态库.so
http://ikinglai.blog.51cto.com/6220785/1324985
在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库。如果有源码的话,可以直接跟你自己的代码一去编译成动态库so,但是如果没有源码的话,你就必须在自己的动态库so里面将别人生成好的静态库导入进来一起编译了。我在编译的时候遇到了不少问题,我觉得有必要进行总结一下。
下面我以一个简单的实际例子来讲解如何在动态库中导入静态库。
静态库中的源代码有两个文件:static.h, static.c,有一个add方法
static.h
|
1
2
|
#include <stdio.h>int add(int x, int y); |
static.c
|
1
2
3
4
5
|
#include "static.h"int add(int x, int y){ return x + y;} |
将它编译成静态库,Android.mk如下:
|
1
2
3
4
5
|
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := static_addLOCAL_SRC_FILES := static.cinclude $(BUILD_STATIC_LIBRARY) |
注意编译静态库的时候,必须有一个Application.mk文件:
|
1
|
APP_MODULES:=static_add |
APP_MODULES的值应该和Android.mk中的LOCAL_MODULE的值保持一样。
然后调用ndk-build进行编译生成libstatic_add.a静态库。
hejinlai_iMac:jni hejinlai$ ndk-build
Prebuilt : libstatic_add.a <= jni/
生成静态库后,然后编写动态库中的源代码: share.h share.c
share.h
|
1
2
|
#include <stdio.h>int test_add(int x, int y); |
share.c
|
1
2
3
4
5
6
7
|
#include "share.h"#include "static.h"int test_add(int x, int y){ // 调用static里面的方法 return add(x, y);} |
编写导入静态库的Android.mk:
|
1
2
3
4
5
6
7
8
9
10
|
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := static_addLOCAL_SRC_FILES := libstatic_add.ainclude $(PREBUILT_STATIC_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := share_addLOCAL_STATIC_LIBRARIES := static_addLOCAL_SRC_FILES := share.cinclude $(BUILD_SHARED_LIBRARY) |
注意上面生成的libstatic_add.a必须跟Android.mk放在同一目录下,否则需要填写相应的路径,然后进行编译:
hejinlai_iMac:jni hejinlai$ ndk-build
Compile thumb : share_add <= share.c
Prebuilt : libstatic_add.a <= jni/
SharedLibrary : libshare_add.so
Install : libshare_add.so => libs/armeabi/libshare_add.so
提示so编译成功。
需要注意的是我这边share.c和static.c放在同一目录下,如果放在不同的目录下,需要指定
LOCAL_C_INCLUDES链接到相应的路径。
Android导入第三方静态库.a编译成动态库.so的更多相关文章
- 表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)
目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetIn ...
- 将pugixml库编译成动态库的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 pugixml库默认是编译成静态库的.要把pugixml库编译成一个动态库,需要对代码做一些修改,具体是将 // If ...
- [dpdk] dpdk编译成动态库使用 -- PCI port自动发现与pmd动态加载
1. 修改配置文件 .conf, 设置如下变量的值. [root@D129 x86_64-native-linuxapp-gcc]# cat dpdk/x86_64-native-linuxapp- ...
- Android:JNI与NDK(二)交叉编译与动态库,静态库
欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...
- windows android studio 编译Jni动态库
项目需要,折腾了半天搞定windows android studio环境编译Jni动态库,现记录下来. 准备安装环境: 1. android studio 下载地址是http://www.androi ...
- 静态库 .a 转成共享库 .so
.a 是有一系列 .o 文件通过 ar 程序打包在一起的静态库,要把它转成动态库只需先解开,生成一堆 .o 文件,再通过编译器(比如 gcc 或 ifort,视具体情况而定)编成动态库即可. ar - ...
- 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包
前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) ...
- Linux程序编译链接动态库版本号的问题
不同版本号的动态库可能会不兼容,假设程序在编译时指定动态库是某个低版本号.执行是用的一个高版本号,可能会导致无法执行. Linux上对动态库的命名採用libxxx.so.a.b.c的格式.当中a代表大 ...
- C# 将 WebService 封装成动态库
C# 将 WebService 封装成动态库 服务与服务之间的远程调用,经常会通过Web Service来实现,Web Service是支持跨语言调用的,可以是java调用c++或c#调用java等, ...
随机推荐
- es6 属性及常用新属性汇总
一.includes的作用: includes:判断isNotShowProIdArray数组里是否包含this.item.productid元素 ,若包含true !!: !!(a)的作用是将a强制 ...
- PYTHON-TCP 粘包
1.TCP的模板代码 收发消息的循环 通讯循环 不断的连接客户端循环 连接循环 判断 用于判断客户端异常退出(抛异常)或close(死循环) 半连接池backlog listen(5) 占用的是内存空 ...
- Webpack devServer中的 proxy 实现跨域
Webpack dev server使用http-proxy解决跨域问题 文档资料 webpack关于webpack-dev-server开启proxy的官方介绍Vue-cli proxyTable ...
- P3660 【[USACO17FEB]Why Did the Cow Cross the Road III G】
题外话:维护区间交集子集的小套路 开两个树状数组,一个维护进入区间,一个维护退出区间 $Query:$ 给定询问区间$l,r$和一些其他区间,求其他区间中与$[l,r]$交集非空的区间个数 用上面维护 ...
- cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做
搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...
- python 全栈开发,Day131(向app推送消息,玩具端消息推送)
先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.4.zip 注意:由于涉及到 ...
- 【C++ Primer | 19】运行类型识别
运行类型识别 一.使用RTTI dynamic_cast运算符的调用形式如下所示: dynamic_cast<type*>(e) //e是指针 dynamic_cast<type&a ...
- 使用k8s operator安装和维护etcd集群
关于Kubernetes Operator这个新生事物,可以参考下文来了解这一技术的来龙去脉: https://yq.aliyun.com/articles/685522?utm_content=g_ ...
- CentOS 用挂了dev/sda1:UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY .
dev/sda1:UNEXPECTED INCONSISTENCY;RUN fsck MANUALLY .(i.e. ,without -a or -p options)fsck died with ...
- AndroidStudio将html5打包成apk
我想将html5的动画效果打包成手机app,以方便传播.而在android开发的组件中就直接由webview可以访问网页,另外在android工程中,assets文件夹下的内容是不会在被编译的,因此可 ...