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_add
LOCAL_SRC_FILES := static.c
include $(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_add
LOCAL_SRC_FILES := libstatic_add.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := share_add
LOCAL_STATIC_LIBRARIES := static_add
LOCAL_SRC_FILES := share.c
include $(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的更多相关文章

  1. 表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)

    目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetIn ...

  2. 将pugixml库编译成动态库的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 pugixml库默认是编译成静态库的.要把pugixml库编译成一个动态库,需要对代码做一些修改,具体是将 // If ...

  3. [dpdk] dpdk编译成动态库使用 -- PCI port自动发现与pmd动态加载

    1.  修改配置文件 .conf, 设置如下变量的值. [root@D129 x86_64-native-linuxapp-gcc]# cat dpdk/x86_64-native-linuxapp- ...

  4. Android:JNI与NDK(二)交叉编译与动态库,静态库

    欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...

  5. windows android studio 编译Jni动态库

    项目需要,折腾了半天搞定windows android studio环境编译Jni动态库,现记录下来. 准备安装环境: 1. android studio 下载地址是http://www.androi ...

  6. 静态库 .a 转成共享库 .so

    .a 是有一系列 .o 文件通过 ar 程序打包在一起的静态库,要把它转成动态库只需先解开,生成一堆 .o 文件,再通过编译器(比如 gcc 或 ifort,视具体情况而定)编成动态库即可. ar - ...

  7. 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包

    前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) ...

  8. Linux程序编译链接动态库版本号的问题

    不同版本号的动态库可能会不兼容,假设程序在编译时指定动态库是某个低版本号.执行是用的一个高版本号,可能会导致无法执行. Linux上对动态库的命名採用libxxx.so.a.b.c的格式.当中a代表大 ...

  9. C# 将 WebService 封装成动态库

    C# 将 WebService 封装成动态库 服务与服务之间的远程调用,经常会通过Web Service来实现,Web Service是支持跨语言调用的,可以是java调用c++或c#调用java等, ...

随机推荐

  1. 今天刚用asp.net做的导出Eecel

    protected void daochu_Click(object sender, EventArgs e)        {                string hql = "s ...

  2. X-Forwarded-For 的一些理解

    X-Forwarded-For 是一个 HTTP 扩展头部, 主要是为了让 Web 服务器获取访问用户的真实 IP 地址(其实这个真实未必是真实的,后面会说到). 那为什么 Web 服务器只有通过 X ...

  3. 详解Android属性动画

    前面我们讲到的属性动画都是使用代码的定义方式:Android属性动画之ValueAnimator和Android属性动画之ObjectAnimator和AnimatorSet,下面我们再来看看使用XM ...

  4. Java基础94 分页查询(以MySQL数据库为例)

    1.概述 分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的).  本文使用的事MySql数据库.       假设:每页显示10条数据.       Select * from c ...

  5. OGNL(对象图导航语言)学习

    一.关于OGNL(Object-Graph Navigation Language),一种可以方便地操作对象属性的开源表达式语言. 特点:  1)支持对象方法调用,形式如:objName.method ...

  6. ADO.NET的五大对象【转】

    ADO.NET是一组用于和数据源进行交换的面向对象类库.通常情况下,数据源是数据库,也可以是文本文件.Excel表或XML文件.ADO.NET的主要类对象有Connection.Command.Dat ...

  7. 对象本田CRV

    <script> window.onload = function (ev) { var vcar = new Car("本田", "CRV", 4 ...

  8. hihocoder 1341 Constraint Checker【string】

    hihocoder 1341 解释:这道题题目还是比较容易理解,就是根据输入的若干个不等式,校验后面输入的数据是否都满足前面的不等式,满足就输出Yes,只要有一个不满足就输出No.如“A<B&l ...

  9. [APIO2011]方格染色

    题解: 挺不错的一道题目 首先4个里面只有1个1或者3个1 那么有一个特性就是4个数xor为1 为什么要用xor呢? 在于xor能把相同的数消去 然后用一般的套路 看看确定哪些值能确定全部 yy一下就 ...

  10. BZOJ1406 [AHOI2007]密码箱 数论

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1406 题意概括 求所有数x,满足 x<n 且 x2≡1 (mod  n). n<=2 ...