对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用。但是在某些情况下,我们需要借助C/C++来写JNI本地代码。比如,在使用跨平台的第三方库的时候;为了提升密集计算性能的时候(这种情况下往往还可能会直接使用汇编语言)。因此,这里我将为大家介绍如何给其它开发者创建可供使用的静态库或动态库。而应用开发者如何去连接这些生成的静态库或动态库。由于现在Android Studio已经比较成熟,因此以下描述将基于Android Studio的目录布局。

在Android Studio的一个项目工程下,会有一个app文件夹,这个文件夹主要存放我们编写应用的所有代码以及相关其它资源。如果我们需要写JNI,那么就需要在这个目录下创建jni文件夹。jni文件夹里必须包含Android.mk文件、Application.mk文件以及你所要编译的源文件。下面我们先给出编译生成提供给第三方开发者使用的静态库与动态库的Android.mk文件内容:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# 编译后生成的模块名,在Java端使用System.loadLibrary加载模块的的时候直接用此名
LOCAL_MODULE := my_blocks# LOCAL_SRC_FILES用于添加源文件(可以是.c,.cpp,.s等)
LOCAL_SRC_FILES := my_block_test.c
LOCAL_SRC_FILES += my_blocks_data.c
LOCAL_SRC_FILES += my_runtime.c# 条件预编译,如果当前架构为ARMv7以下的架构,则定义MY_NO_CSWAP这个宏
ifeq ($(TARGET_ARCH_ABI),armeabi)LOCAL_CFLAGS := -DMY_NO_CSWAP=1
endif# 连接系统编译出的静态库
LOCAL_STATIC_LIBRARIES := cpufeatures
LOCAL_STATIC_LIBRARIES += ld.goldLOCAL_LDLIBS := -llog# 用于生成动态库
# include $(BUILD_SHARED_LIBRARY)# 用于生成静态库
include $(BUILD_STATIC_LIBRARY)$(call import-module,cpufeatures)

然后,我们把上述编译脚本中所列出的my_block_test.c、my_blocks_data.c以及my_runtime.c这三个源文件放在jni目录下即可编译。

最后,用Android JNI编译器工具——ndk_build编译完之后就可在生成的obj目录下看到my_blocks.a文件了。在Unix/Linux下,.a表示静态库文件;.so表示动态共享库文件。

下面我们将创建另一个工程,这个工程将构建最终可执行的应用。其Android.mk文件描述如下:

LOCAL_PATH := $(call my-dir)### 以下这段用于预构建我们将要连接的已存在的静态库或动态库 ###

include $(CLEAR_VARS)# 我们将连接已编译好的my_blocks模块
LOCAL_MODULE    := my_blocks# 填写源文件名的时候,要把静态库或动态库的文件名填写完整。
# $(TARGET_ARCH_ABI)/ 表示将不同架构下的库文件存放到相应架构目录下
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmy_blocks.a# LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmy_blocks.so# 用于预构建静态库(后面可被连接)
include $(PREBUILT_STATIC_LIBRARY)# 用于预构建动态库(后面可被连接)
# include $(PREBUILT_SHARED_LIBRARY)# 这里要注意的是,对于一次预构建只能预构建动态库,要么是静态库,两者不能共存### 以下内容用于描述编译当前工程的源代码 ###

include $(CLEAR_VARS)LOCAL_MODULE := mytestLOCAL_SRC_FILES := test.cLOCAL_STATIC_LIBRARIES := cpufeatures
LOCAL_STATIC_LIBRARIES += ld.gold# 连接我们前面声明好的静态库
LOCAL_STATIC_LIBRARIES += my_blocks# 连接我们前面声明好的动态库
# LOCAL_SHARED_LIBRARIES += my_blocks

LOCAL_LDLIBS := -llog# 将此模块构建为动态库
include $(BUILD_SHARED_LIBRARY)$(call import-module,cpufeatures)

下面我们来看一下这个工程jni的目录结构内容:

在arm64-v8a、armeabi等每个架构名目录下,都要包含有我们在第一个工程中生成出来的静态库或动态库文件,并且要与架构名相一致。比如一下是arm64-v8a下的内容:

然后,我们需要编辑Application.mk文件,如下所示:

# 使用当前NDK编译器所支持的所有处理器架构
APP_ABI := all# 使用LLVM Clang 3.6编译器工具链
NDK_TOOLCHAIN_VERSION=clang3.6# 开启C11标准,外加GNU语法扩展
APP_CFLAGS += -std=gnu11# 启用Blocks语法
APP_CFLAGS += -fblocks

最后,我们在Java端只需加载我们当前所要执行的动态库模块即可,不需要关心前一个工程所生成的、用于给当前JNI模块所使用的动态库或静态库。

Android NDK生成及连接静态库与动态库相关推荐

  1. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  2. android jni通过cmake使用第三方静态库和动态库

    google 官方现在推荐使用cmake来构建jni. 本人正好工作需要使用第三方的静态库和动态库,写此文 权当做个记录. 首先修改app的build.gradle文件 ndk {abiFilter ...

  3. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...

    一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...

  4. NDK 编译和使用静态库、动态库

    NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...

  5. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  6. Gcc详解以及静态库、动态库生成

    [转] Gcc详解以及静态库.动态库生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1.gcc包含的c/c++编译 ...

  7. 安卓linux交叉编译,Linux Ubuntu下用Android NDK 生成独立交叉编译链

    本文主要介绍使用Android NDK生成独立交叉编译链,然后使用独立交叉编译链编译Android程序 下载NDK 下载与自己操作系统相吻合的版本 下载地址 解压到安装目录(如~/myndk): ta ...

  8. linux下生成静态库和动态库

    linux下生成静态库和动态库 一.动态库.静态库简介 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常.本质上 ...

  9. Linux下GCC生成和使用静态库和动态库详解(二)

    2.1准备好测试代码hello.h.hello.c和main.c: hello.h(见程序1)为该函数库的头文件. hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏 ...

最新文章

  1. expect--自动批量分发公钥脚本
  2. 经典分类:线性判别分析模型!
  3. 只需两步,Tomcat JVM 参数性能迅速调到最优!
  4. 从睡姿就可以看出你的性格,据说非常准,快存!
  5. java线程代码实现_Java 多线程代码实现讲解
  6. pip更换源 windows10_Conda及Pip换源处理
  7. C++Postfix Expression 后缀表达式的评估算法(附完整源码)
  8. android的logcat详细用法
  9. oracle报609,ORA-609 错误分析及解决方法
  10. Unity3D利用代码生成脚本模板
  11. 业余剪辑——从拍摄到剪辑到加字幕
  12. 中标麒麟V7安装Qt5.13.0
  13. 增量式PID计算公式4个疑问与理解
  14. css ul1,CSS 列表样式 ul
  15. 做个坚强的逆行者,献给终日奋斗的你我——《当幸福来敲门》
  16. 视频渲染靠cpu还是显卡 视频渲染的作用是什么
  17. matlab中syms类型的转换
  18. c# 获取数字的小数位数
  19. tensorflow聊天机器人python实现_用 TensorFlow 做个聊天机器人
  20. ONF(Open Networking Foundation)

热门文章

  1. php语句导入mysql_php如何将数据库导入mysql
  2. 两个向量的点乘和叉乘怎么算_【解析几何】赋值法(点乘双根法)解决解析几何大题...
  3. JavaScript中的点击事件
  4. mysql的局限_Mysql数据分区局限性大总结
  5. 定时执行sql统计数据库连接数并记录到表中
  6. js正则替换字符串中的变量为变量的值
  7. vue----sourceMap
  8. 计算机二级考试题有之前的吗,国家计算机二级上机做对前两题为什么过不了
  9. window10运行python弹出商店_解决 win10 命令行下运行 python 弹出 Windows 应用商店
  10. IDEA Maven项目添加本地jar包