挖個(gè)坑。等我踩完這個(gè)系列的坑來(lái)再來(lái)填。先粗略寫下。
編譯環(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類似于Windows中的cmd。
復(fù)制粘貼的命令可以參考此鏈接:
https://segmentfault.com/q/1010000002898504
使用shift + insert應(yīng)該是可以粘貼的,至于復(fù)制,應(yīng)該可以配置為選中即復(fù)制。
不知道為什么無(wú)法編譯成功,可能是因?yàn)橹板e(cuò)誤地進(jìn)行了編譯,改變了源文件,因此我再重新試試。
編寫build_android.sh腳本文件,如果從網(wǎng)上直接copy過去可能會(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使用啦~
下面開始使用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開發(fā)環(huán)境之后還需配置環(huán)境變量,配置NDK環(huán)境變量看這里
http://www.lxweimin.com/p/0099d0e5d3d7
http://www.lxweimin.com/p/708e6bf68ae9)。
測(cè)試是否成功配置方法,通過cmd進(jìn)入命令行,輸入ndk-build。
下圖為未配置情況。
下面進(jìn)行配置
這里可以看出NDK是已經(jīng)安裝好了的,但是并沒有配置環(huán)境。
首先下載NDK(雖然AS中安裝了NDK但是還是需要下載),下載地址:
https://developer.android.com/ndk/downloads/index.html
谷歌中國(guó)站雖然開通了,所以可以使用下面的這個(gè)網(wǎng)站,
這里是中國(guó)站下載地址:https://developer.android.google.cn/ndk/downloads/index.html
比較下發(fā)現(xiàn)貌似就是google后面加了cn,所以以后如果沒有遇到developer.android.google打不開網(wǎng)站鏈接的情況下可以試試加cn訪問中國(guó)站啦。
選擇所需版本。
下好之后解壓到android-ndk文件夾中,然后配置環(huán)境。
再通過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沒配置好。
cannot resolve corresponding JNI function的解決方法
File--->Setting--->plugins
將 Android NDK Support 的對(duì)勾勾掉
然后重啟AS
過程中還發(fā)現(xiàn)一個(gè)問題,結(jié)果發(fā)現(xiàn)是因?yàn)樯傻腸om_cc_myapplication_MainActivity.h文件不全導(dǎo)致的。(因?yàn)樵诰帉慚ainActivity之前生成了),因此無(wú)法調(diào)用native函數(shù)。
產(chǎn)生這個(gè)錯(cuò)誤表示無(wú)法調(diào)用native函數(shù),沒有配置好。
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)用的話,一定是沒有配置好。復(fù)制代碼的時(shí)候,得看看包名是否都改了,又或者,你可以直接把自己的工程的包名建成跟作者一樣,這樣就不用改了。
改完之后,需要重新使用ndk-build編譯生成可以通過JNI調(diào)用的類庫(kù),否則還是之前生成的類庫(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后面加上一段。
然后重新開始編譯ffmpeg庫(kù)。
syntax error: unexpected end of file
DOS下文件和Linux下文件格式差異問題導(dǎo)致的。
發(fā)現(xiàn)是這段出現(xià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)行編寫shell文件,我先跳過這個(gè)問題,不再多糾結(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.lxweimin.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/