[編譯]如何編譯OpenSVCDecoder Android版本

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即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章