编译FFmpeg源文件并在Android Studio中使用的简单例子

挖个坑。等我踩完这个系列的坑来再来填。先粗略写下。

编译环境:win7+Android Studio

————————————

具体实现:在Android Studio下使用FFmpeg的最简单输出Hello Wworld。

这里需要用到NDK,目前还无法熟练使用,因此记录下来。



首先,我们需要下载FFmpeg源码。

下载地址:http://ffmpeg.org/download.html

然后下载:MinGW。

下载完毕后MinGW需要安装。安装时其实先装的是个下载管理器,到选择安装选项的时候要选上msys-base和mingw32-gcc-ada两项。


选择[Installation] - [Apply Changes],安装

成功安装后如下图。


然后添加环境变量。


运行D:\MinGW\msys\1.0目录下的msys.bat,cd到ffmpeg目录执行build_android.sh

msys.bat类似于Windows中的cmd。



复制粘贴的命令可以参考此链接:

https://segmentfault.com/q/1010000002898504

使用shift + insert应该是可以粘贴的,至于复制,应该可以配置为选中即复制。

不知道为什么无法编译成功,可能是因为之前错误地进行了编译,改变了源文件,因此我再重新试试。


编写build_android.sh脚本文件,如果从网上直接copy过去可能会是dos格式,使用dos2unix build_android.sh 转换一下,删掉多余空格。(出处:http://www.cnblogs.com/blogs-of-lxl/p/6252130.html?utm_source=itdadao&utm_medium=referral)


结果认真地修改了如图所示处


后来发现之前的错误原因在于build_android.sh中TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

这一句的路径设置错误了。因为代码的出处编译环境是Mac,而Mac跟Windows路径是不一样的,Mac环境下是darwin-x86_64,Windows是windows-x86_64。

重新执行,结果依然是会报错的,比如出现command not found。

但是其实实际上已经在生成so文件了。然后就需要漫长的等待了。需要几分钟,去吃根雪糕冷静下先。


最后成功生成一系列.h文件。


新建的ffmpegtemp目录下会生成文件。

D:\ffmpeg\ffmpeg-3.3.3\ffmpegtemp

ffmpeg-3.3.3目录下也会生成一个android文件。,这里面有so文件。

到这里为止,ffmpeg库文件就编译好啦~

可以被Android Studio使用啦~

下面开始使用Android Studio测试编译好的SO库。

创建工程,并新建 jni 目录。

(这里新建普通的工程文件就好,不用勾选include C++,我第一次新建的时候新建错了,后来重新建立了一个工程文件那些才能正常运行)。

Android Studio如何创建.mk文件

右键 新建-file 在输入的时候加上.mk即可


虽然报错,但是依旧成功生成头文件。


运行ndk-build(需配置NDK环境变量。em...配置好安卓SDK开发环境之后还需配置环境变量,配置NDK环境变量看这里

http://www.jianshu.com/p/0099d0e5d3d7

http://www.jianshu.com/p/708e6bf68ae9)。

测试是否成功配置方法,通过cmd进入命令行,输入ndk-build。

下图为未配置情况。

下面进行配置

这里可以看出NDK是已经安装好了的,但是并没有配置环境。

首先下载NDK(虽然AS中安装了NDK但是还是需要下载),下载地址:

https://developer.android.com/ndk/downloads/index.html


谷歌中国站虽然开通了,所以可以使用下面的这个网站,

这里是中国站下载地址:https://developer.android.google.cn/ndk/downloads/index.html

比较下发现貌似就是google后面加了cn,所以以后如果没有遇到developer.android.google打不开网站链接的情况下可以试试加cn访问中国站啦。

选择所需版本。



下好之后解压到android-ndk文件夹中,然后配置环境。

再通过cmd进入命令行,输入ndk-build检测是否配置好。

此时,如下图所示:


切换到Android程序src/main/jni目录中,直接执行ndk-build脚本就可以了。


成功生成如下图所示。

生成是SO文件在 src/main/libs/armeabi-v7a中


现在,还需要配置gradle文件才能运行。

在buildTypes之前的位置加上,

sourceSets.main{

jniLibs.srcDir'src/main/libs'

jni.srcDirs=[]

}


这时就可以运行程序查看效果了。

报了个错。android:onClick不能用

参考网址:http://blog.csdn.net/shaw1994/article/details/18953771

http://blog.csdn.net/xlh1191860939/article/details/53019592

java.lang.IllegalStateException: Could not execute method for android:onClick


结果发现是因为xml文件中context没配置好。

cannot resolve corresponding JNI function的解决方法

File--->Setting--->plugins

将 Android NDK Support 的对勾勾掉

然后重启AS

过程中还发现一个问题,结果发现是因为生成的com_cc_myapplication_MainActivity.h文件不全导致的。(因为在编写MainActivity之前生成了),因此无法调用native函数。

产生这个错误表示无法调用native函数,没有配置好。

07-30 20:32:15.460 19330-19330/com.cc.myapplication E/art: No implementation found for java.lang.String com.cc.myapplication.MainActivity.avformatinfo() (tried Java_com_cc_myapplication_MainActivity_avformatinfo and Java_com_cc_myapplication_MainActivity_avformatinfo__)


还有这里也需要改,总之,无法调用的话,一定是没有配置好。复制代码的时候,得看看包名是否都改了,又或者,你可以直接把自己的工程的包名建成跟作者一样,这样就不用改了。

改完之后,需要重新使用ndk-build编译生成可以通过JNI调用的类库,否则还是之前生成的类库,依然会报错。

其实程序调用的是这里的文件。


最后成功图片有4张,分别点击4个按钮结果如下图:



编译FFmpeg生成了六个SO文件,现在把这6个合成一个,修改脚本文件build_android.sh。



改为

–enable-static

–disable-shared

以及在install后面加上一段。

然后重新开始编译ffmpeg库。



syntax error: unexpected end of file

DOS下文件和Linux下文件格式差异问题导致的。

发现是这段出现了问题(因为删掉这里才可以正常编译)。

dos2unix build_android.sh  尝试使用这个删除多余的空格,但是依然不行。http://blog.csdn.net/pml18710973036/article/details/68482885

解决办法应该是需要使用vim来转换格式。这里就这样吧,应该是换行引起的错误,需要使用Linux环境来进行编写shell文件,我先跳过这个问题,不再多纠结。

$TOOLCHAIN/bin/arm-linux-androideabi-ld \

-rpath-link=$PLATFORM/usr/lib \

-L$PLATFORM/usr/lib \

-L$PREFIX/lib \

-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \

$PREFIX/libffmpeg.so \

libavcodec/libavcodec.a \

libavfilter/libavfilter.a \

libswresample/libswresample.a \

libavformat/libavformat.a \

libavutil/libavutil.a \

libswscale/libswscale.a \

-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \

$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \


$ chmod +x build_android.sh

$ ./build_android.sh


————————————————————————————

这里是坑的分割线。。。。

参考链接:

最主要是这个链接:http://www.ihubin.com/blog/android-ffmpeg-demo-2/  

http://blog.csdn.net/hejjunlin/article/details/52661331

http://blog.csdn.net/leixiaohua1020/article/details/47008825

http://www.jianshu.com/p/dfd0de17601c

http://www.cnblogs.com/tt2015-sz/p/6148723.html


Windows下使用MinGW编译FFmpeg

https://forevas.github.io/2017/03/20/Windows%E4%B8%8B%E4%BD%BF%E7%94%A8MinGW%E7%BC%96%E8%AF%91FFmpeg/

推荐阅读更多精彩内容