注:原版发布于OphoneSDN,如需转载请参考OPhoneSDN版权声明
目录
1 移植目标
将H264解码器移植到Android操作系统之上(NDK+C),并写一个测试程序(OPhoneSDK+Java)测试解码库是否正常运行,下面是解码时的截图:
OPhone的模拟器和Mobile的模拟器一样是模拟ARM指令的,不像Symbian模拟器一样执行的是本地代码,所以在模拟器上模拟出来的效率会比真实手机上的效率要低,之前这款解码器已经优化到在nokia 6600(相当低端的一款手机,CPU主频才120HZ)上做到在线播放。
2 面向人群
本文面向有一定的手机应用开发经验(例如:S60/Mobile/MTK)和有一定的跨手机平台移植经验的人员,帮助她们了解一个企业的核心库(C/C++)是怎么移植到OPhone之上的。
3 假定前提
1、 你熟悉Java/C/C++语言;
2、 你熟悉Java的JNI技术;
3、 你有一定的跨手机平台移植经验;
4、 你有一套可供移植的源代码库,这里我以H264解码库为例,这里因为版权问题,这里只能够公开头文件:
#ifndef __H264DECODE_H__ #define __H264DECODE_H__
#if defined(__SYMBIAN32__) //S602rd/3rd/UIQ #include <e32base.h> #include <libc/stdio.h> #include <libc/stdlib.h> #include <libc/string.h> #else //Windows/Mobile/MTK/Android #include <stdio.h> #include <stdlib.h> #include <string.h> #endif
class H264Decode { public: /***************************************************************************/ /* 构造解码器 */ /* @return H264Decode解码器实例 */ /***************************************************************************/ static H264Decode *H264DecodeConstruct(); /***************************************************************************/ /* 解码一帧 */ /* @pInBuffer 指向H264的视频流 */ /* @iInSize H264视频流的大小 */ /* @pOutBuffer 解码后的视频视频 */ /* @iOutSize 解码后的视频大小 */ /* @return 已解码的H264视频流的尺寸 */ /***************************************************************************/ int DecodeOneFrame(unsigned char *pInBuffer,unsigned int iInSize,unsigned char *pOutBuffer,unsigned int &iOutSize); ~H264Decode(); }; #endif // __H264DECODE_H__
|
你不用熟悉Android系统,因为在此之前,我也不熟悉;
4 开发环境
4.1 安装Eclipse
下载Eclipse Classic 3.5.0 (162 MB) + CDT,并安装它,安装非常简单,这里就不详细介绍了。
4.2 安装Cygwin
Cygwin是一个在windows平台上运行的unix模拟环境,这个东东是移植常用到的工具,比较大,下载安装很简单。点击下载
FAQ 1:
测试NDK环境,如果遇到下面问题怎么办?
请检查你的make版本是否为3.81,如果不是,请升级你的Cygwin版本,我就是因为这个原因,折腾了半天。
|
4.3 安装Android NDK
简单来说NDK是让开发者使用传统的C/C++语言编写Android模块的一个开发包,目前NDK还不支持编写有界面的应用程序,只能够用来编写一些动态链接库。点击下载
4.4 安装OPhone SDK
参见OPhone SDN官方教程《安装OPhone SDK》
4.5 安装OPhone插件
安装Eclipse插件ADT和WDT,参见OPhone SDK官方教程《安装Eclipse插件ADT》《安装Eclipse插件WDT》
5 移植过程
5.1 移植流程
5.2 封装Java接口
在《假定前提》中提到了要移植的函数,接下来会编写这些函数的Java Native Interface。
/** * @author panzhenyu * @email panzhenyu88@gmail.com */
package panzhenyu.streaming.video.h264; |