Symbian

Symbian手机开发BLOG

My Links

存档

Blog Stats

Monday, June 1, 2009 #

在Symbian程序中使用汇编代码

单介绍一下。Symbian手机一般跑的都是ARM的CPU的,那么一般的ARM汇编当然也可以使用了。

NOKIA提供的SYMBIAN开发都是C/C++的例子程序,就封装了绝大多数的底层操作。不过有些时候,为了加快运行速度,我们还是可以使用汇编语言来编写子程序的。当然,使用的是ARM汇编,而不是我们一般学习的80X86汇编

这里我举个简单的TestArm.S的汇编例子.
首先,在src目录下增加一个TestArm.S的文件。然后写上如下的汇编代码。

 
CODE:
.text
.global MyAdd
MyAdd:
add r0,r0,r1
mov pc,lr

完成一个加法的子程序。
然后,在View类的C++程序中,增加对它使用的代码:

 
CODE:
extern "C"{
extern int MyAdd(int a,int b);
}

记住,汇编写出来的都是C语言的函数。
使用直接使用这个函数就OK了。

 
CODE:
int c = MyAdd(100,100);

最后,修改MMP文件。

庆幸的是,GCC能够自己识别汇编还是C/C++文件。所以,直接增加到MMP一行就OK了。
 
CODE:
SOURCE                                  TestArm.S

不过最后说一下,这样只能是在abld build armi urel来编译。不能在WINDOWS上编译,更不能在WINDOWS上运行,或者说是80X86上运行。

关于ARM汇编语言的编写,找一些搞嵌入式开发的资料就可以了。其实Symbian也无法是个嵌入式设备的操作系统。

 

posted @ 10:35 AM | Feedback (0)

Sunday, May 31, 2009 #

收采的一些编程计算机类网站

posted @ 10:09 AM | Feedback (0)

Saturday, May 30, 2009 #

MIDP2.0游戏API总结

gameapi 提供了5个新类:GameCanvas,Layer,LayerManager,Sprite,TiledLayer


1.GameCanvas类,是Canvas的子类,为游戏提供了基本的屏幕功能,
  构造方法为protected GameCanvas(boolean suppresKeyEvents) 它的构构建需要一个布尔参数来决定是否抑制按键事件

  绘制缓冲屏幕方法:
    void flushGraphics():它会等到缓冲屏幕完全复制到手机屏幕上才会返回
    void flushGraphics(int x,int y,int width,int height)

  获取画布Graphics对象的方法:
    protected Grahpics getGraphics()

  获取键盘状态:
    int getKeyStates()

 

2.Sprite类
  构造方法
  public Sprite (Image image)
  public Sprite (image image,int frameWidth,int frameHeight)
  public Sprite (Sprite s)
 
 Image对象是所使用的图像,可以在后面设定
 public void setImage(Image img,int frameWidht,int frameHeight)

 

  对帧序列中的帧进行操作的方法:
  public int getFrame()
  public int getFrameSequenceLength()
  public int getRawFrameCount()'返回所有原始帧的总数
  public void nextFrame()
  public void prevFrame()
  public void setFrame(int sequenceIndex)

  自行设置帧序列方法:
  public void setFrameSequence(int[] sequence)


  精灵的翻转方法
  setTransform()
 
  关于参考点的一些方法:
  public void defineReferencePixel(int x,int y)'定义参考点位置
  public void setRefPixelPosition(int x,int y)'用参考点指定Sprite 的初现位置
  public int getRefPixelX()
  public int getRefPixelY()


  关于碰撞检测的方法
  public boolean collidesWith(Image image,int x,int y,boolean pixelLevel)
  public boolean collidesWith(Sprite s,boolean pixelLevel)
  public boolean collidesWith(TiledLayer t ,boolean pixelLevel)
  public void defineCollisionRectangle(int x,int y,int width,int height)'用于定义碰撞检测的Sprite 矩形区域,指定的矩形是想对于未经变换的Sprite 的左上角
 

转自:http://www.j2mehome.com

 

 

posted @ 12:35 PM | Feedback (0)

Tuesday, May 26, 2009 #

Symbian中关于位图的操作

symbian 开发中的位图操作有点和Windows SDK的相似,有Context有Device,下面具体说说:

Bitmap graphics context
由CBitmapContext类提供了一个Graphics context(CGraphicsContext)的位图graphics的实现.它提供了以下特性:
1、清除和拷贝矩形区域;
2、位图的块传输(block transfer);
3、设置pen色彩和灰度;
4、设置shadow mode;
5、将GC的设置reset到缺省值

Window Server Client端的API提供了一个实现:CWindowGc,这主要是用于屏幕绘图的,另一个实现是CFbsBitGc,这主要是用于in-memory位图的绘制,这些都各有用处:)

参见下图


Bitmap graphics device
由CBitmapDevice类提供了一个Graphics device(CGraphicsDevice)的位图graphics实现。

这里Window Server Client端的API提供了一个实现,CWsScreenDevie,用于屏幕绘制。另一个实现是CFbsBitmapDevice,用于绘制一个in-memory位图,还有一个是CFbsScreenDevice,主要是用来(很少用)直接访问屏幕,跳过了window server的中介。

参见下图



位图的操作维系在CFbsBitmap,它可以表示一个被font和bitmap server所管理的位图。 它提供位图的生成,加载和存储。相关的还有一个TBitmapUtil类,这个类提供
给用户很多函数来操作位图的bits(!),呵呵,是不是很实用啊。

位图一般根据其大小被存储在两个不同的堆中,大尺寸位图(这里有个限度值,为4KB)的存储位置和小尺寸位图是不同的,存储大尺寸位图的堆可以自动进行碎片整理以优化其空间:)

每个位图都有寸有两个尺度单位,一个是twip大小,这是所见即所得的真实世界大小尺寸,还有一个是象素尺寸。

如果要要更直接的操作位图,可以使用CFbsBitmap::DataAddress(), 它可以获得位图加载到内存中的地址,以次来操作位图bit,恐怕是最快的方法了,不过很烦,呵呵,注意了,这里如对RGB进行操作,要注意到色彩的差别,一般概念上的是0xXXXXXX,用6位来表示RGB值,这成为24-bit色彩,但3650/7650的是4094色,即12bit色彩(4KColor),因此操作时,我们要在两者之间转换,我们可以使用TRgb::Color4K进行转换,注意了,其参数是TInt值,不要写*Address样式,否则在模拟器上能通过,手机上就会报告Kern-Exec 3错误了,很头疼:)

原文链接: http://www.j2mehome.com/symbian/2009/0526/8724.html


 

posted @ 11:58 AM | Feedback (0)