havlenapetr-FFMpeg移植到android2.3
之前编译过havlenapetr-FFMpeg,参考网上的一些帖子编译成功生成libffmpeg_jni.so,并使用havlenapetr提供的libjniaudio.so和libjnivideo.so,在虚拟机下播放正常,在真机下出现花屏问题,参考http://blog.csdn.net/yarpee/article/details/6910877,做相应更改后正常播放,但只可以在android2.2下运行。主要原因是libjnivideo.so和libjniaudio.so 这两个so文件因为不同的版本或者修改过的framework是不一样的,所以需要在android源码中 编译出自己的so文件。
在android2.3下编译生成libjnivideo.so和libjniaudio.so
参考 http://blog.csdn.net/cibon/article/details/7398795
我的环境是windows下vmware虚拟机centos系统,分配硬盘空间20G以上(编译之后好像有16G,要提前留出足够的空间)。(Google官方说明android源码的编译只能在macOS和linux下进行,所以说cygwin是无能为力了)
准备工作:
1). android2.3源码(可以通过git和repo下载到Google官方提供的android源码,可能需要很长时间,根据网速而定)参考http://source.android.com/source/downloading.html
2). havlenapetr在github上的另一个开源项目,修改过的frameworks/base/native/ https://github.com/havlenapetr/android_frameworks_base
现在的这个项目native目录下已经没有我们需要的东西了,我用的是git下载的代码,只要git checkout froyo,回滚到之前的版本就会看到了。
2.3下编译源码的步骤
1. 将android_frameworks_base/native文件夹下的 video和audio文件夹 复制到android源码/frameworks/base/native/文件夹下。
2. 将android_frameworks_base/native/include/android/surface.h 和 android_frameworks_base/native/include/android/audiotrack.h 复制到android源码/frameworks/base/native/include/android/文件夹下。
3.将frameworks/base/native/video/jni/surface.cpp中32行mSurface改为mNativeSurface.
4. 在android源码文件夹下,
source build/envsetup.sh
lunch 1
make
在这个过程中可能会有些问题,我遇到的有以下,其他问题可以上网搜索。
1). 我的android源码是从Windows下复制到虚拟机上的,make时可能出现权限不够的问题。
错误:
/bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gcc: Permission denied
/bin/bash: build/core/find-jdk-tools-jar.sh: Permission denied
解决方法:chmod a+x给这几个文件夹权限 或 直接 chmod 777 * -R /android源码文件夹
2).
错误:
sh: gperf: not found
calling gperf failed: 32512 at ./makeprop.pl line 96.
make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h] Error 25
make: *** Deleting file `out/target/product/generic/obj/SHARED_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h'
解决方法:
没有找到gperf,通过sudo yum install gperf 安装gperf,(红帽和ubuntu 用 sudo apt-get install gperf)
安装后可以继续编译。
3).后面还遇到些问题,具体忘了,网上都有解答,最后我是直接make -i 编译的。
最后,这样就能在 out/target/product/generic/obj/lib/中找到libjniaudio.so libjnivideo.so,将这两个so文件和havlenapetr-FFMpeg编译好的libffmpeg_jni.so放到havlenapetr-FFMpeg下libs/armeabi下就可以了。
havlenapetr-FFMpeg中的java代码有些错误,FFMpegMovieViewAndroid.java 中可能有错误,按照错误指示添加空实现就可以。项目可能有引入android包的错误,在项目properties中Java Build Path中删除多余的Libraries,留下你想要的android版本就可以。