挖个坑。等我踩完这个系列的坑来再来填。先粗略写下。
编译环境: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++,我第一次新建的时候新建错了,后来重新建立了一个工程文件那些才能正常运行)。
右键 新建-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/