环境是阿里云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写的
欢迎入坑!
网友评论