android .so静态导入,Android导入第三方静态库.a编译成动态库.so

这篇博客详细介绍了如何在Android开发中将静态库导入到动态库中进行编译。首先,作者展示了如何将C/C++源码编译成静态库,接着说明了如何在动态库中引用这个静态库并进行编译。博客内容包括创建静态库的Android.mk和Application.mk文件,以及动态库中引入静态库的Android.mk文件的编写。最后,博主分享了编译过程中的注意事项和步骤,包括静态库与动态库文件的位置以及头文件的包含路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://ikinglai.blog.51cto.com/6220785/1324985

在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库。如果有源码的话,可以直接跟你自己的代码一去编译成动态库so,但是如果没有源码的话,你就必须在自己的动态库so里面将别人生成好的静态库导入进来一起编译了。我在编译的时候遇到了不少问题,我觉得有必要进行总结一下。

下面我以一个简单的实际例子来讲解如何在动态库中导入静态库。

静态库中的源代码有两个文件:static.h, static.c,有一个add方法

static.h

1

2

#include

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 

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链接到相应的路径。

表格树控件QtTreePropertyBrowser编译成动态库&lpar;设计师插件&rpar;

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

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

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

&lbrack;dpdk&rsqb; dpdk编译成动态库使用 -- PCI port自动发现与pmd动态加载

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

Android:JNI与NDK&lpar;二&rpar;交叉编译与动态库,静态库

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

windows android studio 编译Jni动态库

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

静态库 &period;a 转成共享库 &period;so

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

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

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

C&num; 将 WebService 封装成动态库

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

随机推荐

git的两本推荐书

1. pro git, 可以网页直接看 http://iissnan.com/progit/?spm=5176.100239.blogcont5843.18.nUJDcK 2. Git权威指南 &lt ...

面试题--&gt&semi;写一个函数,返回一个数组中所有元素被第一个元素除的结果

package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...

7、JavaScript总结——实现选项卡切换的效果

编程挑战 现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居    200万内购五环三居 140万安家东三环 ...

团队项目&&num;183&semi;冰球模拟器——cmake 自动化构建系统的配置文件的编写

1 前言 考虑到命令行界面下编译程序并不如在 IDE 那么直观,再考虑到各位队友对 Linux 并不熟悉,如何大幅度地减轻整个项目的开发复杂度就是一个很重要的问题. 在 Linux 下有个很古老但很有 ...

Java线

线程是一个单一的程序流程.多线程是指一个程序,可以在同一时间执行多个任务.每个任务是由一个单独的线程以完成.那.够同一时候在一个程序中执行,而且每个线程完毕不同的任务.程序能够通过控制线程来控制程序的 ...

SAS中常见的数组函数

SAS中常见的数组函数有: dim dimk hbound hboundk lbound lboundk 数组函数计萁数组的维数.上下界,有利于写出可移植的程序,数组函数包括:dim(x) 求数组x第 ...

Percona MySQL 5&period;7 Linux通用二进制包安装&lpar;CentOS 6&rpar;

Linux 安装 Percona http://blog.itpub.net/26506993/viewspace-2136501/ https://www.cnblogs.com/snowwhite ...

LeetCode--219、268、283、414、448 Array&lpar;Easy&rpar;

219. Contains Duplicate II Given an array of integers and an integer k, find out whether there are t ...

ReportMachine OCX 的使用方法

ReportMachine OCX http://rmachine.haotui.com/thread-55-1-1.html RMReport.ocx RMEngine.Init(1); // 初始 ...

iOS 排序算法总结、二分法查找

1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值