Android studio 2.2开始支持cmake的方式进行jni开发,我在另一篇10.Eclipse下Ndk开发(ffmpeg解码)中写过Eclipse下编译ffmpeg的过程,但是现在几乎没有人会使用eclipse作为Android开发工具了,所以很有必要写一下使用Android studio进行jni开发的一般步骤。

首要确保两点:第一,你的Android studio 是2.2及以版本,第二,在你的sdk tools中,确保安装了ndk,cmake,LLDB这三个东西。
其中LLDB是一个高效的c/c++的调试器,目前LLDB也已经取代GDB成为XCode的默认调试器,在Android studio中也可以使用。
CMake 则是一个跨平台的编译工具。

ndk配置.png

那么我们如何进行开发呢,Android studio中项目的目录结构又是怎样安排,各有什么意义?

android studio下cmake编译ndk

新建项目时,添加c++支持很简单,Android studio为我们提供了一个选项(Include C++ support),只需要勾选,系统会为我们默认添加一些配置

那么如果是在旧项目上添加呢,这就需要我们手动配置一下了

Cmake配置文件目录.png

第一步,创建CMakeLists.txt文件,注意,文件名必须这样设置,大小写区分,默认放在项目根目录下,或者在其他位置,只需要你在build.gradle中配置即可

第二步,在项目根目录的build.gradle文件中配置

android {......defaultConfig {......// 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,armeabi,arm-v8之类的so会被过滤掉)//例如如果的的so只支持arm平台,那么就像下边这样设置,如果还支持其他平台则再后边追加ndk{abiFilters 'armeabi'}}......externalNativeBuild{//配置CMakeLists文件地址cmake{path 'CMakeLists.txt'}}
}

这里贴出来我的CMakeLists.txt配置文件

部分参数解析:
include_directories:表示引入项目so文件所需的头文件的路径,在配置文件中配置之后,编写c代码的时候可以会在当前路径下查找头文件,引入的路径可以少些一些层级

find_library:引入内部已经支持的库文件

add_library:引入外部添加的库文件

cmake_minimum_required(VERSION 3.4.1)#引入头文件位置
include_directories(src/main/cpp/include/ffmpeg)
include_directories(src/main/cpp/include/owner)find_library(android-libandroid
)find_library(log-liblog
)find_library(jnigraphics-libjnigraphics
)#自己的库
add_library(newffmpegSHAREDsrc/main/cpp/ffmpeg_player.c
)# 编解码(最重要的库)
add_library(avcodecSHAREDIMPORTED
)#指定编码库的位置
set_target_properties(avcodecPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec-56.so
)#设备信息
add_library(avdeviceSHAREDIMPORTED
)#指定设备信息的位置
set_target_properties(avdevicePROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavdevice-56.so
)#滤镜特效处理库
add_library(avfilterSHAREDIMPORTED
)#指定滤镜库位置
set_target_properties(avfilterPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavfilter-5.so
)#封装格式处理库
add_library(avformatSHAREDIMPORTED
)#指定格式库路径
set_target_properties(avformatPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavformat-56.so
)#工具库(大部分库都需要这个库的支持)
add_library(avutilSHAREDIMPORTED
)#指定工具库路径
set_target_properties(avutilPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavutil-54.so
)#后期处理
add_library(postprocSHAREDIMPORTED
)#指定后期处理库路径
set_target_properties(postprocPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libpostproc-53.so
)#数据格式转换库
add_library(swresampleSHAREDIMPORTED
)#指定库位置
set_target_properties(swresamplePROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libswresample-1.so
)#视频像素数据格式转换
add_library(swscaleSHAREDIMPORTED
)
#视频像素格式转换库位置
set_target_properties(swscalePROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libswscale-3.so
)# 将预构建库与本地库相连
target_link_libraries(newffmpegavcodecavdeviceavfilteravformatavutilpostprocswresampleswscale${android-lib}${jnigraphics-lib}${log-lib}
)
so和C文件目录划分

配置文件搞好了,接下来就要正式的引入编译好的ffmpeg so文件了,如果不知道如何编译,可以参考我之前的一片文章 09.阿里云服务器(Ubantu系统)配置ndk 编译ffmpeghttps://www.jianshu.com/p/826d2175f157,我们在项目main package下创建jniLibs文件夹,将编译好的so放入这里

so目录.png

jniLibs目录也是系统默认支持的,你当然可以设置其他名字,或者将目录放在别的位置,但是要注意,如果你这样做,一定要在build.gradle中进行指定,否则系统找不到这些文件

细心的你可能发现在上边的截图上还有一个cpp的目录,这个目录是我们一般用来防止头文件和c c++文件的,系统默认不会创建这个目录,也需要我们手动添加,除非你在创建项目的时候就添加了c++ support

这时候,基本上过程已经接近尾声了,我们来看一下都做了什么:
1.创建CMakeLists.txt脚本文件
2.在build.gradle中配置编译选项
3.将so库加入jniLibs文件夹,将.h 和 .c(c++)文件放入cpp目录
4.还有一步,我们要创建native方法,生成头文件,加载so,
5.最后一步就是调用了,这一整个过程到此结束

package com.rzm.ffmpeglibrary;
public class FFmpegUtils {static{System.loadLibrary("newffmpeg");}public native static void decode(String input,String output);
}
#include "com_rzm_ffmpeglibrary_FFmpegUtils.h"
/** Class:     com_rzm_ffmpeglibrary_FFmpegUtils* Method:    decode* Signature: ()V*/
JNIEXPORT void JNICALL Java_com_rzm_ffmpeglibrary_FFmpegUtils_decode
(JNIEnv *env, jclass jclazz,jstring input,jstring output){}

其实这里还有很多细节可以多说一点,比如javah命令如何生成头文件,javap命令如何获取方法或者属性的签名,最重要的一点,ffmpeg从编写脚本文件到开始编译,这一整个过程如何走来,这些基本上在之前的文章中有提到,这里就不再多说了。

总结一下,这里提到的每个过程,CMakeLists.txt文件的编写才是重中之重,也正是我想说的,把脚本中每一个命令搞清楚,在ndk开发的路上你就更近一步了。

26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)相关推荐

  1. android studio下NDK开发

    2019独角兽企业重金招聘Python工程师标准>>> 1.NDK 的下载 和 配置 NDK 下载地址 : https://developer.android.com/ndk/ind ...

  2. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为"交叉编译"? 先看什么是 JNI?JNI 的全称就是 Java ...

  3. Android下NDK开发环境搭建

    Android下NDK开发环境搭建 1.     AndroidNDK安装与配置 1.1  NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...

  4. 使用Android Studio 进行NDK开发和调试

    2019独角兽企业重金招聘Python工程师标准>>> 尽管Android Studio已经越来越流行了,但很多人还是习惯于Eclipse或源码环境下开发JNI应用.个人认为使用An ...

  5. Android studio中NDK开发(四)——使用addr2line分析Crash日志 backtrace

    文章目录 一.前言 二.分析 1.先提取backtrace部分 2.提取对应so库的信息 3.提取错误地址 三.使用addr2line对地址进行转换 1.addr2line工具的路径放在 2.Term ...

  6. 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )

    文章目录 安卓直播推流专栏博客总结 一. RTMP 协议 二. RTMP 协议使用 三. RTMPDump 源码下载 四. RTMPDump 源码交叉编译 五. RTMPDump 源码导入 Andro ...

  7. Eclipse下NDK开发与调试

    Eclipse下NDK开发 一.关于NDK: NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动 ...

  8. android stdudio OpenCV NDK 开发环境搭建 之找查条形码

    开发环境 Android Studio 3.6 SDK 28 NDK:android-ndk-r17b JAVA JDK 1.8 1,opencv sdk 下载 我这里下载的是 3.4.8 OpenC ...

  9. Android学Jni/Ndk 开发记录(一)

    治疗拖延症的唯一办法就是:一想起些什么 / 要做些什么就 TM 立马去做! 是的,突然想起我不会 JNI.NDK 开发.解决办法:立马去学! 一:配置 NDK 环境 下载 NDK 写入到配置文件 二: ...

最新文章

  1. 【FFmpeg】使用过的命令汇总(持续更新中...)
  2. 蓝桥杯 密文搜索(全排列)
  3. python 装饰器是啥?
  4. 送你一朵小红花观后感
  5. 数据库发展研究报告(2021年)
  6. 三年Java开发经验,必须要掌握的知识技能树有哪些?
  7. linux centos git 自动更新,在centos上搭建git服务器并自动同步代码
  8. 收集一些Qt学习网站
  9. GEE搭建python环境时出现WinError10060,一招解决,亲测有效!
  10. 【名单回顾】2019/2020年第11届蓝桥杯大赛青少年组(北京赛区)选拔赛C++初级组一二等奖获奖名单
  11. 遭遇难题,走投无路到成功解决的心路历程 —— ORA12514:监听程序当前无法识别连接描述符中请求的服务
  12. *jqwidgets jqxgrid 使用心得 jqxgrid教程 jqxgrid+SpringMVC(初级) 集成JAVA SSM
  13. 安装docker-ce报错
  14. 倡议书格式范文_倡议书写作格式及范文(范本).doc
  15. 【转】国内外优秀的计算机视觉团队汇总
  16. LTE物理层概述(6)-- LTE之调制与解调及其matlab仿真
  17. c语言格式字符-5d,-是什么意思在c语言中%5d是什么意思? 爱问知识人
  18. RGB灯带简单案例 - 玛克君arduino
  19. 已知三点求平面方程、平面法向量和点到平面的距离(转载)
  20. windows10 英文路径下文件显示中文名称

热门文章

  1. 仿抖音注册Dialog实现
  2. Visual Studio 2015 update 3各版本下载地址
  3. PHP笔记 ---关于web应用的安全性问题
  4. linux常用命令总结
  5. 手机拍照成像误区解读
  6. 服务器端打开excel 检索 COM 类工厂 错误: 80070005
  7. ASP处理多关键词查询实例代码
  8. Spring Boot + Swagger
  9. 根据类名遍历数组的三种方法
  10. 软件测试用例文档模板 简书,如何写出高质量的测试用例