挖個(gè)坑。等我踩完這個(gè)系列的坑來(lái)再來(lái)填莺禁。先粗略寫(xiě)下攻冷。
編譯環(huán)境:win7+Android Studio
————————————
具體實(shí)現(xiàn):在Android Studio下使用FFmpeg的最簡(jiǎn)單輸出Hello Wworld未荒。
這里需要用到NDK承耿,目前還無(wú)法熟練使用,因此記錄下來(lái)博投。
首先绸贡,我們需要下載FFmpeg源碼。
下載地址:http://ffmpeg.org/download.html
然后下載:MinGW毅哗。
下載完畢后MinGW需要安裝听怕。安裝時(shí)其實(shí)先裝的是個(gè)下載管理器,到選擇安裝選項(xiàng)的時(shí)候要選上msys-base和mingw32-gcc-ada兩項(xiàng)虑绵。
選擇[Installation] - [Apply Changes]尿瞭,安裝
成功安裝后如下圖。
然后添加環(huán)境變量翅睛。
運(yùn)行D:\MinGW\msys\1.0目錄下的msys.bat筷厘,cd到ffmpeg目錄執(zhí)行build_android.sh
msys.bat類(lèi)似于Windows中的cmd。
復(fù)制粘貼的命令可以參考此鏈接:
https://segmentfault.com/q/1010000002898504
使用shift + insert應(yīng)該是可以粘貼的宏所,至于復(fù)制,應(yīng)該可以配置為選中即復(fù)制摊溶。
不知道為什么無(wú)法編譯成功爬骤,可能是因?yàn)橹板e(cuò)誤地進(jìn)行了編譯,改變了源文件莫换,因此我再重新試試霞玄。
編寫(xiě)build_android.sh腳本文件骤铃,如果從網(wǎng)上直接copy過(guò)去可能會(huì)是dos格式,使用dos2unix build_android.sh 轉(zhuǎn)換一下坷剧,刪掉多余空格惰爬。(出處:http://www.cnblogs.com/blogs-of-lxl/p/6252130.html?utm_source=itdadao&utm_medium=referral)
結(jié)果認(rèn)真地修改了如圖所示處
后來(lái)發(fā)現(xiàn)之前的錯(cuò)誤原因在于build_android.sh中TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
這一句的路徑設(shè)置錯(cuò)誤了。因?yàn)榇a的出處編譯環(huán)境是Mac惫企,而Mac跟Windows路徑是不一樣的撕瞧,Mac環(huán)境下是darwin-x86_64,Windows是windows-x86_64狞尔。
重新執(zhí)行丛版,結(jié)果依然是會(huì)報(bào)錯(cuò)的,比如出現(xiàn)command not found偏序。
但是其實(shí)實(shí)際上已經(jīng)在生成so文件了页畦。然后就需要漫長(zhǎng)的等待了。需要幾分鐘研儒,去吃根雪糕冷靜下先豫缨。
最后成功生成一系列.h文件。
新建的ffmpegtemp目錄下會(huì)生成文件端朵。
D:\ffmpeg\ffmpeg-3.3.3\ffmpegtemp
ffmpeg-3.3.3目錄下也會(huì)生成一個(gè)android文件好芭。,這里面有so文件逸月。
到這里為止栓撞,ffmpeg庫(kù)文件就編譯好啦~
可以被Android Studio使用啦~
下面開(kāi)始使用Android Studio測(cè)試編譯好的SO庫(kù)。
創(chuàng)建工程,并新建 jni 目錄碗硬。
(這里新建普通的工程文件就好瓤湘,不用勾選include C++,我第一次新建的時(shí)候新建錯(cuò)了恩尾,后來(lái)重新建立了一個(gè)工程文件那些才能正常運(yùn)行)弛说。
Android Studio如何創(chuàng)建.mk文件
右鍵 新建-file 在輸入的時(shí)候加上.mk即可
雖然報(bào)錯(cuò),但是依舊成功生成頭文件翰意。
運(yùn)行ndk-build(需配置NDK環(huán)境變量木人。em...配置好安卓SDK開(kāi)發(fā)環(huán)境之后還需配置環(huán)境變量,配置NDK環(huán)境變量看這里
http://www.reibang.com/p/0099d0e5d3d7
http://www.reibang.com/p/708e6bf68ae9)冀偶。
測(cè)試是否成功配置方法醒第,通過(guò)cmd進(jìn)入命令行,輸入ndk-build。
下圖為未配置情況进鸠。
下面進(jìn)行配置
這里可以看出NDK是已經(jīng)安裝好了的稠曼,但是并沒(méi)有配置環(huán)境。
首先下載NDK(雖然AS中安裝了NDK但是還是需要下載)客年,下載地址:
https://developer.android.com/ndk/downloads/index.html
谷歌中國(guó)站雖然開(kāi)通了霞幅,所以可以使用下面的這個(gè)網(wǎng)站漠吻,
這里是中國(guó)站下載地址:https://developer.android.google.cn/ndk/downloads/index.html
比較下發(fā)現(xiàn)貌似就是google后面加了cn,所以以后如果沒(méi)有遇到developer.android.google打不開(kāi)網(wǎng)站鏈接的情況下可以試試加cn訪問(wèn)中國(guó)站啦。
選擇所需版本。
下好之后解壓到android-ndk文件夾中抒巢,然后配置環(huán)境案铺。
再通過(guò)cmd進(jìn)入命令行,輸入ndk-build檢測(cè)是否配置好。
此時(shí),如下圖所示:
切換到Android程序src/main/jni目錄中,直接執(zhí)行ndk-build腳本就可以了划提。
成功生成如下圖所示。
生成是SO文件在 src/main/libs/armeabi-v7a中
現(xiàn)在邢享,還需要配置gradle文件才能運(yùn)行鹏往。
在buildTypes之前的位置加上,
sourceSets.main{
jniLibs.srcDir'src/main/libs'
jni.srcDirs=[]
}
這時(shí)就可以運(yùn)行程序查看效果了骇塘。
報(bào)了個(gè)錯(cuò)伊履。android:onClick不能用
參考網(wǎng)址: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
結(jié)果發(fā)現(xiàn)是因?yàn)閤ml文件中context沒(méi)配置好。
cannot resolve corresponding JNI function的解決方法
File--->Setting--->plugins
將 Android NDK Support 的對(duì)勾勾掉
然后重啟AS
過(guò)程中還發(fā)現(xiàn)一個(gè)問(wèn)題款违,結(jié)果發(fā)現(xiàn)是因?yàn)樯傻腸om_cc_myapplication_MainActivity.h文件不全導(dǎo)致的唐瀑。(因?yàn)樵诰帉?xiě)MainActivity之前生成了),因此無(wú)法調(diào)用native函數(shù)插爹。
產(chǎn)生這個(gè)錯(cuò)誤表示無(wú)法調(diào)用native函數(shù)哄辣,沒(méi)有配置好。
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__)
還有這里也需要改赠尾,總之力穗,無(wú)法調(diào)用的話,一定是沒(méi)有配置好气嫁。復(fù)制代碼的時(shí)候当窗,得看看包名是否都改了,又或者寸宵,你可以直接把自己的工程的包名建成跟作者一樣崖面,這樣就不用改了。
改完之后梯影,需要重新使用ndk-build編譯生成可以通過(guò)JNI調(diào)用的類(lèi)庫(kù)巫员,否則還是之前生成的類(lèi)庫(kù),依然會(huì)報(bào)錯(cuò)甲棍。
其實(shí)程序調(diào)用的是這里的文件疏遏。
最后成功圖片有4張,分別點(diǎn)擊4個(gè)按鈕結(jié)果如下圖:
編譯FFmpeg生成了六個(gè)SO文件,現(xiàn)在把這6個(gè)合成一個(gè)财异,修改腳本文件build_android.sh。
改為
–enable-static
–disable-shared
以及在install后面加上一段唱遭。
然后重新開(kāi)始編譯ffmpeg庫(kù)戳寸。
syntax error: unexpected end of file
DOS下文件和Linux下文件格式差異問(wèn)題導(dǎo)致的。
發(fā)現(xiàn)是這段出現(xiàn)了問(wèn)題(因?yàn)閯h掉這里才可以正常編譯)拷泽。
dos2unix build_android.sh? 嘗試使用這個(gè)刪除多余的空格疫鹊,但是依然不行。http://blog.csdn.net/pml18710973036/article/details/68482885
解決辦法應(yīng)該是需要使用vim來(lái)轉(zhuǎn)換格式司致。這里就這樣吧拆吆,應(yīng)該是換行引起的錯(cuò)誤,需要使用Linux環(huán)境來(lái)進(jìn)行編寫(xiě)shell文件脂矫,我先跳過(guò)這個(gè)問(wèn)題枣耀,不再多糾結(jié)。
$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
————————————————————————————
這里是坑的分割線庭再。捞奕。。拄轻。
參考鏈接:
最主要是這個(gè)鏈接: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.reibang.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/