文章目录

  • I . 动态库 与 静态库
  • II . 编译动态库
  • III. Android Studio 使用第三方动态库
  • IV . Android Studio 关键代码
  • V . 博客资源

I . 动态库 与 静态库


1 . 函数库分类 : ① 动态库 , ② 静态库 ;

2 . 静态库 :

编译链接时 , 将整个库文件打包到可执行文件中 , 造成可执行文件较大 , 但运行时不需要库文件 ;

Android 与 Linux 静态库 后缀为 “.a” ;

3 . 动态库 :

编译链接时 , 不将库打包入可执行文件中 , 在程序运行时调用到该库时才链接加载该动态库 ;

Android 与 Linux 静态库 后缀为 “.so” ;

4 . 静态库与动态库对比 :

① 静态库时间效率高 : 执行时没有动态链接的操作 , 所有的代码都在可执行文件内部 , 时间消耗少 ;

② 动态库空间效率高 : 动态库如果被多个程序调用 , 只要有一个动态库在内存中即可 ;

II . 编译动态库


1 . 要编译的源文件 : add.c 源文件 ;

#include <stdio.h>int add(int a, int b){return a + b;
}

2 . 共享动态库编译参数 : 编译动态库需要添加 “-fPIC” 和 “-shared” 两个参数 ;

3 . 编译命令 :

① 设置 编译器 临时环境变量 :

export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

② 设置指定 头文件和函数库 的临时环境变量 :

export HEAD_LIB="--sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"

③ 最终命令 :

$CC $HEAD_LIB -fPIC -shared add.c -o libadd.so

4 . 编译结果 : 在该目录下生成了 libadd.so 动态库 ;

book@book-virtual-machine:~/NDK$ export CC=/home/book/NDK/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
book@book-virtual-machine:~/NDK$ export HEAD_LIB="--sysroot=/home/book/NDK/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include -isystem /home/book/NDK/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
book@book-virtual-machine:~/NDK$ $CC $HEAD_LIB  -fPIC -shared add.c -o libadd.so
book@book-virtual-machine:~/NDK$ ls
add.c             android-ndk-r17c-linux-x86_64.zip  libadd.so
android-ndk-r17c  a.out                              main.c
book@book-virtual-machine:~/NDK$

目录中的 libadd.so 就是编译完成的动态库 , 该动态库可以放到 Android Studio 项目中使用 ;

III. Android Studio 使用第三方动态库


1 . 拷贝动态库 :

在 AS 项目的 main 目录下 , 创建 jniLibs/armeabi-v7a 目录 , 将 libadd.so 拷贝到该目录中 ;

2 . CMakeLists.txt 中配置动态库 :

配置示例 :

# 设置变量
# CMAKE_CXX_FLAGS 表示会将 C++ 的参数传给编译器
# CMAKE_C_FLAGS 表示会将 C 参数传给编译器# 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译器时 , 在 该参数后面指定库的路径
#   CMAKE_SOURCE_DIR 指的是当前的文件地址
#   -L 参数指定动态库的查找路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a")

3 . Module 级别的 build.gradle 中配置动态库 :

在 android -> defaultConfig -> externalNativeBuild -> cmake 下添加 abiFilters "armeabi-v7a" 配置 ;

defaultConfig {...externalNativeBuild {cmake {cppFlags ""abiFilters "armeabi-v7a"}}}

4 . 在 C++ 中调用该库 :

① 首先声明该动态库中的方法 :

注意 : 这是在 C++ 语言中调用 C 语言方法 , 要使用 extern "C"{} 兼容 C 和 C++ 调用 ;

//调用 libadd.so 动态库中的方法
extern "C" {    //注意在 C++ 中调用 C 语言方法 , 需要做兼容设置extern int add(int a, int b);
}

② 调用动态库中的函数 : 之后就可以在该 C++ 文件中任意使用该方法了 ;

5 . 执行结果 :

01-25 19:40:27.444 5929-5929/kim.hsl.makeflie I/JNI_TAG: libadd.so : sum = 3

IV . Android Studio 关键代码


1 . CMakeLists.txt 配置文件 :

cmake_minimum_required(VERSION 3.4.1)add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.cpp)# 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib
#   这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so
#   不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库
find_library(log-liblog)# 设置变量
# CMAKE_CXX_FLAGS 表示会将 C++ 的参数传给编译器
# CMAKE_C_FLAGS 表示会将 C 参数传给编译器# 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译器时 , 在 该参数后面指定库的路径
#   CMAKE_SOURCE_DIR 指的是当前的文件地址
#   -L 参数指定动态库的查找路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/armeabi-v7a")target_link_libraries(native-lib# 表示要链接 libadd.so 动态库add${log-lib})

2 . native-lib 本地 C++ 文件 :

#include <jni.h>
#include <string>#include <android/log.h>//调用 libadd.so 动态库中的方法
extern "C" {    //注意在 C++ 中调用 C 语言方法 , 需要做兼容设置extern int add(int a, int b);
}extern "C" JNIEXPORT jstring JNICALL
Java_kim_hsl_makeflie_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello = "Hello from C++";//调用动态库中的函数int sum = add(1, 2);//打印计算结果__android_log_print(ANDROID_LOG_INFO, "JNI_TAG", "libadd.so : sum = %d", sum);return env->NewStringUTF(hello.c_str());
}

3 . Module 级别的 build.gradle 配置文件 :

apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.0"defaultConfig {applicationId "kim.hsl.makeflie"minSdkVersion 15targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags ""abiFilters "armeabi-v7a"}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test:runner:1.2.0'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

V . 博客资源


CSDN 博客地址 : 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

博客资源下载地址 : https://download.csdn.net/download/han1202012/12148685

示例代码 GitHub 地址 : https://github.com/han1202012/004_NDK_Makeflie

【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )相关推荐

  1. 《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶

    本节书摘来自异步社区<Android NFC开发实战详解>一书中的第6章,第6.4节Android NFC P2P开发进阶,作者 赵波,更多章节内容可以访问云栖社区"异步社区&q ...

  2. Android jni开发--NDK环境搭建

    谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK.而在NDKr7开始,Google的Windows版的NDK提供 ...

  3. Android商城开发----viewPager实现广告轮播(在首页Fragment中实现)

    Android商城开发----在商城首页Fragment使用viewPager实现广告轮播 写在前面:本篇文章建立在创建底部导航栏之后,对商城首页进行开发.创建底部导航栏的内容请查看:Android开 ...

  4. 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )

    文章目录 I . FFMPEG 播放视频流程 II . OpenSLES 播放音频流程 III . OpenSLES 播放参考 Google 官方示例 IV . OpenSL ES 播放代码 ( 详细 ...

  5. Android UI开发第三十三篇——Navigation Drawer For Android API 7

    Creating a Navigation Drawer中使用的Navigation Drawer的android:minSdkVersion="14",现在Android API ...

  6. 《Android应用开发攻略》——1.15 程序:Android OS下的小费计算器Tipster

    1.15 程序:Android OS下的小费计算器Tipster Sunit Katkar 1.15.1 问题 当你和朋友前往饭店就餐并且希望计算各自的账单和小费时,可能陷入许多手动计算和分歧之中.你 ...

  7. android前端开发工具,分享七个非常有用的Android开发工具和工具包

    过去的2010年是Android全面爆发的一年,出众的扩展性使其成为了众多玩家的购机首选,市场占有率节节攀高.本文与大家分享七个非常有用的Android开发工具和工具包,希望对从事Android开发的 ...

  8. 实战交叉编译——Ubuntu下交叉编译MiniDLNA到DD-WRT

    技术交流请联系企鹅252726O5O 先介绍一下我的软硬件环境: 编译环境:Win7 64bit -> VMWare Player -> Ubuntu14.04 64bit 目标环境:Ne ...

  9. android nfc开发_意法半导体NFC产品线完整 满足多元应用_企业动态_新闻中心

    意法半导体策略行销经理黄镫谊. 随着製造成本下跌,近几年以RFID短场无线通讯技术为基础的NFC,几乎已成为多数行动装置必备的近场通讯技术.尤其NFC资料传输属于短距离.低传输速度,且运作过程中几乎接 ...

最新文章

  1. 2023 USNews全美计算机研究生院排名发布!MIT、CMU分别称霸总榜和AI分榜
  2. JavaScript 面向对象实战思想
  3. asp.net控件本质
  4. 安装卸载功能 [测试思路]
  5. mysql子查询分为几种方法_MYSQL子查询的5种形式
  6. HashSet 的contains方法
  7. 十大应用在数学的计算机语言
  8. 计算机基础知识187,中职计算机基础 (187)(11页)-原创力文档
  9. STM32工作笔记0011---认识跳线帽
  10. Thread 线程基础之-线程相关知识
  11. ado.net mysql 转义_ADO.NET数据库查询
  12. 贝叶斯定理决策规则及Bayes思想总结
  13. 一路去**ddss第4天
  14. 自带CA ,sha256 哈希签名,2048 位加密 脚本,通用
  15. 如何修改安卓app图标和名称
  16. 最新Xcode打包ipa步骤
  17. java两个日期相减_java将两个日期相减得到天数
  18. office 打开wps乱_wps打开word的乱码咋办?
  19. Meson构建系统(二)
  20. 思岚SLAMTEC A1开箱测试(实现雷达数据的查看+hector_slam建图)

热门文章

  1. 后盾网lavarel视频项目---lavarel中的tinker是什么
  2. LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)...
  3. CentOS进不了mysql
  4. (多图) 基于FPGA的FIR数字滤波器设计与仿真
  5. SQL Server 2005 Service Broker 初探
  6. 入门Leaflet之小Demo
  7. Node版本管理nvm, npm
  8. Pandas数据处理实战:福布斯全球上市企业排行榜数据整理
  9. 【Linux】【通信】1.ping不通
  10. Mybatis用法小结