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

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

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

static.h#include

int add(int x, int y);

static.c#include "static.h"

int add(int x, int y)

{

return x + y;

}

将它编译成静态库,Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := static_add

LOCAL_SRC_FILES := static.c

include $(BUILD_STATIC_LIBRARY)

注意编译静态库的时候,必须有一个Application.mk文件:

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#include

int test_add(int x, int y);

share.c#include "share.h"

#include "static.h"

int test_add(int x, int y)

{

// 调用static里面的方法

return add(x, y);

}

编写导入静态库的Android.mk:

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.bp编译生成so,Android导入第三方静态库.a编译成动态库.so相关推荐

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

    http://ikinglai.blog.51cto.com/6220785/1324985 在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库.如果有源码的话,可以直接跟你自己 ...

  2. 将静态库编译到动态库中

    最近做一个东西,需要采集硬件设备的音视频数据,然后做编码.以前做过编码部分直接拽过来使用,只写硬件采集部分即可.  调查发现,硬件采集驱动过于老旧,必须使用ffmpeg3的API,而编码部分则使用了f ...

  3. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )

    文章目录 前言 一.加载 libnattive.so 动态库 二. libnattive.so 动态库启动 三. pthread_create 线程开发 四. 线程执行函数 前言 libbridge. ...

  5. android studio中把c/c++文件编译成.so库(一)

    2019独角兽企业重金招聘Python工程师标准>>> 最近的项目涉及到JNI编程,经过一段时间的JNI编程之后,终于完美弄完了.所以,把在android studio中编译c/c+ ...

  6. Android.mk编译java动态库

    一, java动态库程序代码 在Anroid层根目录新建study/java_lib/lib目录, 并创建文件名: com/wq/mytestjar/Test.java package com.wq. ...

  7. sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...

    1 前言 2 自定义规则实现 2.1 规则功能 2.2 实现规则的理论基础 2.3 规则代码实现 3 总结 4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库,内置的 Bazel ...

  8. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  9. 头文件和库文件区别,动态库和静态库的区别,动静态库的生成

    文章目录 一.什么是头文件?什么是库文件?有什么区别? 先说总结 目标文件 二.什么是静态库?什么是动态库?有什么区别? 三.为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明 ...

最新文章

  1. mysql 去重取出最小值_5000字总结MySQL单表查询,新手看这一篇足够了!
  2. 在linux下玩转usb摄像头
  3. 19年8月 字母哥 第三章 spring boot 配置原理实战 用热点公司网不行
  4. springboot 中使用 Mybatis 注解 配置 详解
  5. 宝德服务器硬盘报警,宝德“超人”系列PR4880G
  6. 控制台怎么查看错误的详细信息_js错误处理,quot;try..catchquot;
  7. FTP server的使用【原创】
  8. 翻滚吧,水瓶君!全日本高中生机器人大赛,“超自然”力量制霸全场
  9. 本地Git仓库关联Github项目
  10. cad插件_CAD插件自动编号安装教程
  11. 数据结构课程设计:算术表达式的求值
  12. PASCAL VOC数据集分析及下载、解压
  13. 【语义分割数据集】——cityscape数据集类别名称
  14. Prometheus node_exporter报错context deadline exceeded
  15. 实战录 | 云端卫士之DPDK技术简介
  16. 这27个电源符号,还傻傻分不清楚?
  17. STM32HAL库-内部Flash在指定页读写保护示例
  18. 用代码抗议996加班:集结在github上的程序员,正在进行一场社会实验
  19. [MySQL学习]常用SQL语句大全总结
  20. Linux 查看服务器几核几G

热门文章

  1. java分哪几部分_Java体系主要分为三部分,下列哪个选项不是其中的一个组成部分?...
  2. 【计算机考研408】磁盘的初始化过程
  3. Hamming Weight的算法分析
  4. URP Lit Shader解析(2)—LitInput.hlsl
  5. 2022年人工智能行业研究报告
  6. 20175227张雪莹 2018-2019-2 《Java程序设计》第三周学习总结
  7. javascript 中搜索数组的四种方法
  8. Mysql统计数据库和表大小
  9. 矩阵的迹\矩阵的秩\伴随矩阵\共轭矩阵,基底、维数与秩,相对某个基底的坐标计算方法
  10. 世界星载SAR发展8—— Discover II (发现者2)(1998,美国)