【转】HM移植

HM的编码全部采用C/C++编写而成,要移植到Android平台上,如果完全重写整个解码器,时间是相当不够的。

好在有了Android NDK,可以轻松地利用已公开的源代码进行修改。

Android NDK使用指南可以参考我的这篇文章:http://blog.csdn.net/luofl1992/article/details/8663171

另外这篇文章也值得一看:http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html


一、

正确编译运行通过之后,会发现解码开始就造成程序崩溃了。

这是在TComRom.cpp中有一处代码不够严谨造成,

在394行左右有如下的语句

  1. // 其中 g_aucConvertToBit[ uiNumBlkSlide ] 是类型为Char的变量  
  2. // 见 TComLib/TypeDef.h 有 typedef char Char;    
  3. // 其值在初始化时为 -1  
  4. UInt log2Blk = g_aucConvertToBit[ uiNumBlkSlide ] + 1;  
  5. // 我们应该做的是把log2Blk类型修改为UChar,即  
  6. UChar log2Blk = g_aucConvertToBit[ uiNumBlkSlide ] + 1;  

至于为什么原来会出错,通过使用logcat工具输出调试信息可以发现某些时候log2Blk的值突然变成了256,

不是 -1 + 1= 0 吗? 

这是因为在ARM下,char编译时默认为unsigned char,那么实际上  

  1. g_aucConvertToBit[ uiNumBlkSlide ] = 255  
所以最终log2Blk的值为256,会造成后面的代码出现内存访问越界。

最终导致程序崩溃。


当然程序中的类似问题不止这一处,要找到所有可能出错的地方一个个修改吗?

这得在原来的代码中增加多少LOG信息,所以我干脆换了另外一种方式。

如何简单解决呢?

我们看到了前面的有个TypeDef.h的头文件,修改一下这个typedef,即

  1. typedef signed char Char;  

完成这个修改之后重新编译,会出很多错误,一般都是用字符串的地方也用了Char类型,

直接都使用强制类型转换进行修改把。

改了十来处的样子,Lib库就可以正常通过编译了。运行无错误。

如果要使用TApp的内容,当然也是差不多的问题,编译的时候找到出错的地方,进行强制类型转换,大概十多处。

建议大家的方法时除非明显的字符串变量直接改成char *类型或者 char []类型,

类的成员或函数成员尽量不要修改类型。

尽量使函数及接口维持原样,以避免引入更多的错误。


二、使用logcat调试

      可以在C/C++代码中增加,也可以在JAVA的代码中增加。

在JAVA中需要这样使用

[java]  view plain copy print ?
  1. #include <android/log.h>  
  2. #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "NcHevcPlayerActivity", __VA_ARGS__))  
  3. #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "NcHevcPlayerActivity", __VA_ARGS__))  
  4. #define LOGI LOGW  
  5. #define LOG  LOGI  
  6. // 。。。。。。  
  7.   
  8. LOGW("x = %d", x); // ,....  

原文:http://blog.csdn.net/luofl1992/article/details/8736149

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值