JNI——FFmpeg编译

2018-10-10  本文已影响0人  追寻米K

环境是阿里云centerOS

在java上编译一个java文件只需要javac   xxx.java 就能编译成class文件,C/C++里面并不能直接使用gcc  xxx.c就能得到一个so动态库,必须要指定头文件的位置,库文件的位置如:

arm-linux-androideabi-gcc-4.9 --sysroot ndk/platforms/android-21/arch-arm

                -isystem ndk/sysroot/usr/include/arm-linux-androideabi  xxx.c

这里只是举一个例子,先要了解sysroot 等是什么意思

了解这些对于以后编译任何库都不再恐惧。

编译FFmpeg:

创建一个文件夹然后下载FFmpeg,在f'fmpeg下载中可以看到所有的版本。

下载FFmpeg:wget http://ffmpeg.org/releases/ffmpeg-4.0.2.tar.gz

解压:tar -xzf ffmpeg-4.0.2

修改权限:chmod 777 -R ffmpeg-4.0.2

FFmpeg是通过自带的configure来编译的,需要配置很多的参数,所以这里自己在封装一层,新建一个android_build.sh在这里调用configure并写好参数,以后编译自需要调用android_build.sh。

FLAG和INCLUDE  那么长,看不懂,更记不住啊,其实不用记住,我们都是代码的搬运工:

用Android Studio 随便打开一个支持C++的demo,选择一个你要编译的版本,就能惊喜的发现早已为你写好。

很多时候我们并不知道要给这些参数赋什么样的值,或者说不知道有哪些值可以使用,比如--target-os,并不知道有哪些具体的os,这个时候就需要打开configure去具体的查看了,里面有很多的case

提供了很多,这里只截取了一点点,如果是mac就要把android改成drawin

开始编译:

别忘了给android_build添加权限

chmod 777 android_build.sh

执行./android_build.sh开始 编译。

编译成功之后:

编译成功

编译成功lib文件夹中会有8个so库,include中是很多的头文件

不同的版本会有不同的编译参数要求,也会有各种坑(有的版本要求传--cpu版本,我这里就没有这个要求)。我遇到的错误:

这里的提示如果不够清楚,要去ffbuild/config.log里查看,直接拉打底部开始查看。

还遇到一个坑是FFmpeg编译的时候要android-21以上,所以上面编译脚本有ANDROID_API=21

注意:这里使用到的NDK一定要是在这里下载的https://developer.android.google.cn/ndk/downloads/index.html

linux 上的ndk是不行的,编译出来的so不能用在android上

集成到Android Studio:

首先把lib中的库和include中的头文件拷贝禁项目

因为要把这些库跟我们自己写的cpp文件生成的库链接起来,所以在CMakeList.txt中导入库并链接库

这是导入一个库,其他的库对应的复制即可,include_directories一定要加,不然头文件找不到。然后链接库:

集成到AS上并不难,但也有一些坑点。

1、上面导入库的几个路径一定要正确

2、链接库的时候自己cpp代码生成的库natvive_lib一定要在第一个,其它8个顺序可以随便。

3、别忘记load库

4、最容易忘记也是最容易坑的地方,所有关于ffmpeg的头文件以及调用ffmpeg方法的地方都要加extern "C",因为ffmpeg是用C写的

欢迎入坑!

上一篇下一篇

猜你喜欢

热点阅读