挖個坑。等我踩完這個系列的坑來再來填。先粗略寫下。
編譯環境: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.lxweimin.com/p/0099d0e5d3d7
http://www.lxweimin.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.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/