1.下載源代碼:http://sourceforge.net/projects/opensvcdecoder/
編譯正式開始:
1. 首先對該工程有個瞭解,Libs文件夾爲該庫的核心文件。本次編譯的內容就主要集中在Libs文件夾中。
2. Libs使用cmake編譯。
3. 打開CMakeLists.txt,可以看到包含五個子文件夾:
a) AVC/h264_baseline_decoder/lib_baseline
b) AVC/h264_main_decoder/lib_main
c) CommonFiles/src
d) SVC/lib_svc
e) SVC/libview
該五個文件夾分別又使用了cmake構建。
4. 試着打開Libs/AVC/h264_baseline_decoder/lib_baseline/CMakeLists.txt,會發現
add_library (AVC_baseline
AVCdisplay.c
BitstreamSkip.c
cavlc_mmx.c
.
.
.
Transform.c
write_back.c
)
相信都能看懂,就是把這麼多.c文件編譯成一個AVC_baseline庫。在Android下需要編寫Android.mk來產生Android版本的庫。
接下來我們就爲這五個子文件夾編譯成Android的動態鏈接庫。
第一個:AVC/h264_baseline_decoder/lib_baseline
Libs/AVC/h264_baseline_decoder/lib_baseline/CMakeLists.txt對應的Android文件爲:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AVC_baseline
LOCAL_C_INCLUDES := /home/cmm/workplace/src_1.12_copy/Libs/AVC/h264_baseline_decoder/lib_baseline
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
include $(BUILD_SHARED_LIBRARY)
在Libs/AVC/h264_baseline_decoder下新建一個文件夾叫做jni,把lib_baseline裏面所有的文件拷貝到jni文件夾中,把上面這個mk文件命名爲Android.mk也放入jni文件夾內,在命令行下,cd Libs/AVC/h264_baseline_decoder,輸入ndk-biuld即可。
該mk文件也十分簡單,就是把LOCL_PATH下的所有.c文件編譯生動態鏈接庫的形式。看so文件已經產生了:共計五個子文件夾,都需要分別編譯,處理方法也一樣。
第二個:AVC/h264_main_decoder/lib_main
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AVC_main
LOCAL_C_INCLUDES := /home/cmm/workplace/src_1.12_copy/Libs/AVC/h264_main_decoder/lib_main
LOCAL_C_INCLUDES += /home/cmm/code/src_1.12/Libs/AVC/h264_baseline_decoder/lib_baseline
#LOCAL_C_INCLUDES += /home/cmm/cmm_dev/include
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
#LOCAL_LDLIBS = -L/home/cmm/android_libs -lavcbaseline -lAVCmain -lmySDL
LOCAL_LDLIBS = -L//home/cmm/workplace/libs_new -lAVC_baseline
include $(BUILD_SHARED_LIBRARY)
注意:LOCAL_LDLIBS用到了前面編譯好的AVC_baseline這個庫,那麼就修改爲你的路徑。
小插曲
由於要用到SDL,並且後面的編譯工作依賴於SDL,所以得先編譯SDL的Android版本,還好SDL支持Android。
下載SDL 2的源代碼,點擊下載 (http://www.libsdl.org/release/SDL2-2.0.3.tar.gz)
解壓時候,把SDL源代碼中的test/testgles.c文件複製到android-project\jni\src下,還有common.c和common.h一併複製過去。
在命令行下cd android-project,運行ndk-build即可,就會產生libSDL2.so和libSDLmain.so,此時,我們需要的是libSDL2.so。
第三個:SVC/lib_svc
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SVCbaseline
LOCAL_C_INCLUDES := /home/cmm/workplace/src_1.12_copy/Libs/AVC/h264_baseline_decoder/lib_baseline
LOCAL_C_INCLUDES += /home/cmm/workplace/src_1.12_copy/Libs/AVC/h264_main_decoder/lib_main
LOCAL_C_INCLUDES += /home/cmm/cmm_dev/include
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
LOCAL_LDLIBS = -llog -lGLESv2 -lOpenSLES -L/home/cmm/workplace/libs_new -lAVC_baseline -lAVC_main -lSDL2
#LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)
注意:LOCAL_LDLIBS依賴的庫有倆是前面編譯的,SDL2爲剛纔編譯的,路徑修改你的路徑。 第四個:SVC/libview
由於OpenSVCDecoder中用的SDL爲1.x版本,SDL2和SDL1. API接口改變了很多,故需要修改libview/sdl.c文件,因改動較大,故放在了博客最後,直接替換即可。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := DisplaySDL
LOCAL_C_INCLUDES := /home/cmm/code/src_1.12/Libs/AVC/h264_baseline_decoder/lib_baseline \
/home/cmm/code/src_1.12/Libs/AVC/h264_main_decoder/lib_main \
/home/cmm/cmm_dev/include/SDL
#LOCAL_C_INCLUDES += /home/cmm/code/src_1.12/Libs/AVC/h264_main_decoder/lib_main
#LOCAL_C_INCLUDES += /home/cmm/cmm_dev/include/SDL
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
#LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
LOCAL_LDLIBS = -llog -L/home/cmm/workplace/libs_new -lAVC_baseline -lAVC_main -lSDL2 -lSVCbaseline
include $(BUILD_SHARED_LIBRARY)
注意:LOCAL_C_INCLUDES讓編譯器找到.h文件,設置爲你電腦正確的路徑。
第五個:CommonFiles/src
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := OpenSVCDec
LOCAL_C_INCLUDES := /home/cmm/workplace/src_1.12_copy/Libs/AVC/h264_baseline_decoder/lib_baseline \
/home/cmm/workplace/src_1.12_copy/Libs/AVC/h264_main_decoder/lib_main \
/home/cmm/workplace/src_1.12_copy/Libs/SVC/lib_svc
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/*.c)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
LOCAL_LDLIBS = -L/home/cmm/workplace/libs_new -lAVC_baseline -lAVC_main -lDisplaySDL -lSVCbaseline
include $(BUILD_SHARED_LIBRARY)
相信應該也沒什麼難度。
最後:到這裏五個庫已經生成,就到了最後怎麼利用這個五個so文件的問題了。再次回到Libs下的CMakeList.txt文件上去,注意
add_executable(OpenSVCDecoder SVC/build/PC.c)
這一句指明瞭可執行程序的位置,我們只需要把PC.c編譯到Android即可。怎麼編譯呢,直接編譯到Android似乎難度很大,命令行的程序在Android我也沒見過,我們可以利用
SDL來運行PC.c。這裏我們還需要稍微修改一下Pc.c文件:
char *argv1[5]={" ","-h264","/sdcard/test/1.264", "-layer", "0"};
播放sd卡中test文件夾下的1.264文件。
把PC.c拷貝到SDL源代碼中的android-project\jni\src下,修改該文件夾下的Android.mk文件,
把YourSourceHere.c修改爲PC.c,即可。再次在jni目錄的父目錄中運行ndk-build即可。這個時候產生的.libSDLmain.so就是我們想要的,到這裏,我們就有了:
libAVC_baseline.so libDisplaySDL.so libOpenSVCDec.so libSVCbaseline.so
libAVC_main.so libmain.so libSDL2.so
這七個so文件,大功告成,直接將SDL源代碼中的android-project導入Eclipse中,把這七個so放入libs/armeabi文件夾中。修改SDLActivity.java
System.loadLibrary("AVC_baseline");
System.loadLibrary("AVC_main");
System.loadLibrary("SDL2");
System.loadLibrary("SVCbaseline");
System.loadLibrary("DisplaySDL");
System.loadLibrary("OpenSVCDec");
System.loadLibrary("main");
編譯得到APK即可。