[编译]如何编译OpenSVCDecoder Android版本
2014-05-22 16:04
337 查看
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,会发现
相信都能看懂,就是把这么多.c文件编译成一个AVC_baseline库。在Android下需要编写Android.mk来产生Android版本的库。
接下来我们就为这五个子文件夹编译成Android的动态链接库。
第一个:AVC/h264_baseline_decoder/lib_baseline
Libs/AVC/h264_baseline_decoder/lib_baseline/CMakeLists.txt对应的Android文件为:
在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_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_LDLIBS依赖的库有俩是前面编译的,SDL2为刚才编译的,路径修改你的路径。
第四个:SVC/libview
由于OpenSVCDecoder中用的SDL为1.x版本,SDL2和SDL1. API接口改变了很多,故需要修改libview/sdl.c文件,因改动较大,故放在了博客最后,直接替换即可。
注意:LOCAL_C_INCLUDES让编译器找到.h文件,设置为你电脑正确的路径。
第五个:CommonFiles/src
相信应该也没什么难度。
最后:到这里五个库已经生成,就到了最后怎么利用这个五个so文件的问题了。再次回到Libs下的CMakeList.txt文件上去,注意
这一句指明了可执行程序的位置,我们只需要把PC.c编译到Android即可。怎么编译呢,直接编译到Android似乎难度很大,命令行的程序在Android我也没见过,我们可以利用
SDL来运行PC.c。这里我们还需要稍微修改一下Pc.c文件:
播放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
编译得到APK即可。
编译正式开始:
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即可。
相关文章推荐
- 如何用ccache加速cocos2d-x android版本的编译
- android编译user版本,如何启用user版本的adb
- 如何指定让Android的NDK工具编译出Release版本或Debug版本的Native程序
- android 如何编译release版本的应用
- android4.0.4版本源码编译后如何使用
- 如何查看uburtu下编译过的android源码版本信息
- Android源码分析(七)-----如何解决java编译版本问题
- android编译user版本,如何启用user版本的adb
- Android如何编译userDebug版本
- android 如何编译单双卡版本
- 如何查看Class文件编译的JDK版本
- 编译as3时如何区分debug和Release版本
- 如何更改Nant编译的目标框架版本?
- NDK编译后的文件如何加载到Android项目
- Android 版本信息如何查看
- [Android] 如何取得版本号码
- 如何让程序集在每次编译时自动产生不同的版本号
- 如何使用VC6编译sqlite3(版本:sqlite-source-3_6_22)
- Android 编译系统 --- 版本信息