BREW静态变量注意事项

前几天,在BREW程序中使用全局变量,在模拟器上运行的时候,模拟器报告Unknow Error(1)的错误,经过检查,文件名,clsid等都没有问题,在模拟器上调试,发现甚至都没有执行入口函数。看来是在系统运行环境的初始化问题上。想到前段时间mtk程序在全局变量的地方,不能调用内存分配,就决定先检查一下这方面。

继续阅读BREW静态变量注意事项

语言陷阱:armcc诡异的Error: L6218E

提前声明,我并未深入研究这个问题,只是觉得诡异而已。

今天在我的一个进行中的项目中,大量使用了array模板(源代码在之前的文章中有),在编译的时候出现了link错误:

Error: L6218E: Undefined symbol ARRAY::~ARRAY() (referred from XXX.o).

看了XXX.h文件,array.h已经添加,应该没有什么问题。使用的用法大概如下(精简后的结构,原始类比这个要复杂的多):

       #include "array.h"
       class XXX
       {
       public:
       XXX(){};
       virtual ~XXX(){};
       static ARRAY< ARRAY > getmatrix()
       {
       ARRAY< ARRAY > result;
       return result;
       }
       };
       

我原始类里面还有其他类型array模板类型,这里只是突出ARRAY,然后就出现了上面的那个错误。

以下是个人猜测出错的原因:

继续阅读语言陷阱:armcc诡异的Error: L6218E

BREW中使用静态变量(2)

原来的文章中,网友wtyqm提到了elf2mod工具,使用这个工具的话,可以使用全局变量和静态变量,由于项目关系,一直未做测试,所以一直以来,都不做保证。最近呢,由于项目关系,又回归了Brew,而且,项目中变态的喜欢使用static,就决定试一下了。不过,在链接的过程中,需要注意一下,就是把链接的参数添加上”-reloc -split”,其他的什么ropi -rwpi之类的,不用做修改。

这篇文章算是对那篇文章的一个回应。在查找当时的评论的时候才发现,已经过了将近1年了。原来的时候,1年的项目经过整理打包,要将近1张光盘的样子,但最近几年似乎懒了很多。

经过这么多年的各种平台开发的历炼,现在写程序早就很自然的开始不用全局变量或者静态变量了,不过,很是怀念写C程序时的那份悠闲和舒坦了。

BREW中关于__rt_sdiv和__rt_udiv的错误

昨天,同事碰到的问题,我第一眼看了说用了除法,他问,难道不能用除法么。除法当然可以用。据他介绍,原来可以编译通过的,没有修改任何配置的脚本。我记得很早之前碰到过这个问题,但忘了要修改什么地方了,看来已经老了。
于是,就按照最原始的办法,看代码什么地方调用了可能引发这两个问题的函数,用IDA进行反编译,找到__rt_sdiv,然后看什么地方调用了该函数,一下子就看到了:

       int fun(int a, int b)
       {
       if (b == 0)
       return ((1<<16)>>1);
       return a/b;
       }
       

当然,上面的写法什么的完全没有问题,那为什么编译不过呢。于是,我看了下他的脚本,link的命令中没有使用-libpath $(ARMLIB),我记得这个是有用的,对比下我的makefile,有这一项,就加上试试,果然是这个问题。
好记性不如烂笔头啊。

BREW使用命令行上传程序

最近的项目只能在手机上运行,稍微修改一下都要在手机上看看,绝大多数手机都会重启的,每次都要在BREW AppLoader中点连接手机,选择程序目录,拖文件,选择确定,等待上传,重启手机,一天的宝贵时间,这个要占大约一半,实在让人无聊透顶。看了下Apploader的帮助,发现可以通过命令行上传,我的文件又都是makefile控制的,将makefile和命令行程序结合,时间非常不错的主意。
关于BREWAppLoader的使用办法可以看程序自带的文档。
当程序中已经存在相同文件的时候,我需要默认的都是覆盖,而apploader每次都会询问,因为我在cygwin下运行,所以很自然的想到了yes命令,结果使用下面的语句:

       yes | BREWAppLoader.com QCOMOEM.dll COM1 -copy  bin/test.mod /mod/test
       

每次都一样问是否要覆盖,使用yes y或者yes a,完全没有效果,但是yes n却有效果,非常奇怪的事情,没有办法,只好复杂一些,绕个圈子:

       BREWAppLoader.com QCOMMON.dll COM1 -del /mod/test/test.mod
       BREWAppLoader.com QCOMOEM.dll COM1 -copy  bin/test.mod /mod/test
       

这下子终于可以不用像之前那样劳累了,使用emacs,配合之前提到的程序设置,一键搞定所有事情,在程序的编译,上传,重启设备的空余之间,还可以做点别的事情。