上篇文章介绍了 FFmpeg
大体的编译流程,并在 Java
层进行 JNI
接口的调用,借此了解 Android
编译底层 so
库的方式,本文主要介绍如何在 Android
平台使用 FFmoeg
命令行对音视频进行操作。
承接上文,本文从编译好各个 so
文件之后,编写 Java
层调用的 c
文件开始。
源代码 GitHub - FFmpegAndroidSupport(注意在 try_cmd 分支)
Java 层 Native 方法
首先进行 Java
层代码的编写,创建 FFmpegSupport
类,加载 so
文件,声明 native
方法。
1 | public class FFmpegSupport { |
生成 .h 头文件
使用 javah
命令根据你的 java
文件自动生成 .h
文件,javah
命令需要 class
文件,所以首先你需要对工程进行编译,生成 class
文件,它位于 project/app/build/intermediates/classes/debug
目录下。
比如我的类叫做 FFmpegSupport
,包名 com.march.fas
,运行命令后生成了 com_march_fas_FFmpegSupport.h
文件,这个 .h
文件的名字应该是可以自定义的,现在是默认的包名类名,我还没有查到相关参数。
1 | javah -d <.h文件生成的目录> -classpath <class文件存储的目录> <包名.类名> |
查看 .h
文件的内容,将 jclass
改为 jobject
,原因的话我也不知道为什么,不是很懂这一块儿,也是查资料慢慢总结的。
1 | /* DO NOT EDIT THIS FILE - it is machine generated */ |
编写对应 c 文件
根据生成的 .h
编写 c
文件,其中 logjni.h
是一个打印日志的工具类,详细可以参考 github
上面的源文件。
1 |
|
准备工作
如上代码中,我们使用 ffmpeg.c
中的 main()
函数,因此需要将 ffmpeg.c
和 ffmpeg.h
拷贝到 jni
目录中,同时 ffmpeg.c
又引用了多个文件,大致有以下几个文件,这些文件都需要拷贝到 jni
目录中
1 | config.h |
跟上一篇文章说的一样,我们还是要将编译好的 so
文件拷贝到 jni
目录,同时编写 Android.mk
和 Application.mk
文件。为了让结构更加清晰,我对目录做了些许改动。在 jni
目录下新建了 prebuilt/armeabi
文件夹,用来存放 so
文件。同时 Android.mk
和 Application.mk
文件也需要做相应修改。
Android.mk
文件,
1 | LOCAL_PATH:= $(call my-dir) |
Application.mk
文件
1 | APP_ABI := armeabi-v7a |