移植HM(HEVC测试软件)到Android平台(ARM)
2013-03-29 13:26
721 查看
HM的编码全部采用C/C++编写而成,要移植到Android平台上,如果完全重写整个解码器,时间是相当不够的。
好在有了Android NDK,可以轻松地利用已公开的源代码进行修改。
Android NDK使用指南可以参考我的这篇文章:/article/3615231.html
另外这篇文章也值得一看:http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html
一、
正确编译运行通过之后,会发现解码开始就造成程序崩溃了。
这是在TComRom.cpp中有一处代码不够严谨造成,
在394行左右有如下的语句
至于为什么原来会出错,通过使用logcat工具输出调试信息可以发现某些时候log2Blk的值突然变成了256,
不是 -1 + 1= 0 吗?
这是因为在ARM下,char编译时默认为unsigned char,那么实际上
最终导致程序崩溃。
当然程序中的类似问题不止这一处,要找到所有可能出错的地方一个个修改吗?
这得在原来的代码中增加多少LOG信息,所以我干脆换了另外一种方式。
如何简单解决呢?
我们看到了前面的有个TypeDef.h的头文件,修改一下这个typedef,即
完成这个修改之后重新编译,会出很多错误,一般都是用字符串的地方也用了Char类型,
直接都使用强制类型转换进行修改把。
改了十来处的样子,Lib库就可以正常通过编译了。运行无错误。
如果要使用TApp的内容,当然也是差不多的问题,编译的时候找到出错的地方,进行强制类型转换,大概十多处。
建议大家的方法时除非明显的字符串变量直接改成char *类型或者 char []类型,
类的成员或函数成员尽量不要修改类型。
尽量使函数及接口维持原样,以避免引入更多的错误。
二、使用logcat调试
可以在C/C++代码中增加,也可以在J***A的代码中增加。
在J***A中需要这样使用
后续有待更新。
好在有了Android NDK,可以轻松地利用已公开的源代码进行修改。
Android NDK使用指南可以参考我的这篇文章:/article/3615231.html
另外这篇文章也值得一看:http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html
一、
正确编译运行通过之后,会发现解码开始就造成程序崩溃了。
这是在TComRom.cpp中有一处代码不够严谨造成,
在394行左右有如下的语句
// 其中 g_aucConvertToBit[ uiNumBlkSlide ] 是类型为Char的变量 // 见 TComLib/TypeDef.h 有 typedef char Char; // 其值在初始化时为 -1 UInt log2Blk = g_aucConvertToBit[ uiNumBlkSlide ] + 1; // 我们应该做的是把log2Blk类型修改为UChar,即 UChar log2Blk = g_aucConvertToBit[ uiNumBlkSlide ] + 1;
至于为什么原来会出错,通过使用logcat工具输出调试信息可以发现某些时候log2Blk的值突然变成了256,
不是 -1 + 1= 0 吗?
这是因为在ARM下,char编译时默认为unsigned char,那么实际上
g_aucConvertToBit[ uiNumBlkSlide ] = 255所以最终log2Blk的值为256,会造成后面的代码出现内存访问越界。
最终导致程序崩溃。
当然程序中的类似问题不止这一处,要找到所有可能出错的地方一个个修改吗?
这得在原来的代码中增加多少LOG信息,所以我干脆换了另外一种方式。
如何简单解决呢?
我们看到了前面的有个TypeDef.h的头文件,修改一下这个typedef,即
typedef signed char Char;
完成这个修改之后重新编译,会出很多错误,一般都是用字符串的地方也用了Char类型,
直接都使用强制类型转换进行修改把。
改了十来处的样子,Lib库就可以正常通过编译了。运行无错误。
如果要使用TApp的内容,当然也是差不多的问题,编译的时候找到出错的地方,进行强制类型转换,大概十多处。
建议大家的方法时除非明显的字符串变量直接改成char *类型或者 char []类型,
类的成员或函数成员尽量不要修改类型。
尽量使函数及接口维持原样,以避免引入更多的错误。
二、使用logcat调试
可以在C/C++代码中增加,也可以在J***A的代码中增加。
在J***A中需要这样使用
import android.util.Log; //... protected void logW(String msg) { Log.w("ActivityName", msg); }在C/C++代码中这样使用
#include <android/log.h> #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "NcHevcPlayerActivity", __VA_ARGS__)) #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "NcHevcPlayerActivity", __VA_ARGS__)) #define LOGI LOGW #define LOG LOGI // 。。。。。。 LOGW("x = %d", x); // ,....
后续有待更新。
相关文章推荐
- ortp库移植到arm平台进行文件传输测试
- Android平台5款GPS导航软件横向对比测试----纸上谈兵-模拟导航
- 假防病毒软件从电脑移植到了 Android 平台
- Android平台5款GPS导航软件横向对比测试 ---- 路试-实际导航体验
- NDK移植havlenapetr/FFMpeg |Android平台实现 【Mark一下,目前仅仅测试了一下可行性(可行,但有问题)|接下来就好好研究研究(站下巨人的肩膀么- -)】
- XXXX软件Android平台移植Porting说明书
- 移植Android系统到基于ARM的平台上-从零到启动
- 假防病毒软件从电脑移植到了 Android 平台
- 移植FFTW到ARM(android)平台
- 移植linux x86 C库 到android arm平台【交叉编译实现应用增量更新】
- FriendlyARM Tiny210v2 SPI接口Android平台测试
- sqlite 移植到arm平台 和测试
- Android平台5款GPS导航软件横向对比测试----界面及操作
- TQ2440平台上Android移植(1)
- Android平台开发-Bluez function porting-蓝牙功能移植
- 深入浅出 - Android系统移植与平台开发(九)- JNI介绍
- 深入浅出 - Android系统移植与平台开发(四)- 搭建Linux编译环境
- 安卓Android ROM定制、移植,安卓软件反编译、汉化实战教程第三篇:厨房环境Cygwin设置。
- 移植MySQL到嵌入式ARM平台
- Android_通过Bugtags平台,方便测试人员提交bug及整个bug系统的管理