对于Android的红火,以及Windows Mobile的跟进,移动OPhone看起来还像是别人的技术。不过如何将J2ME API移植到OPhone,本文就谈论这些。
中国拥有世界最庞大的电信客户群,仅移动用户就达4亿,3G在中国有最大的市场做后盾,无论现在的市场发展如何的困难,3G费用的降低是大势所趋,不久的将来,必然形成巨大的3G浪潮,3G手机会如雨后春笋一般,充满祖国大地,如今各大移动通信运营商和移动终端开发商都看到广大的前景,在为3G做最后的准备。最近作为中国移动业务最大的运营商中国移动公司推出了自己的开发平台:OPhone OS系统。OPhone OS采用linux2.6内核,兼容Android应用。
OPhone是中国移动在这次3G浪潮来临前打造的主力航空母舰,与中移动无线业务平台的对接,OPhone将承载大量3G业务应用。大量的软件开发企业将会把新的阵地放到移动平台上来,软件如:手机电视、炒股、网游,企业应用MIS,移动办公,都将会是移动设备发展的热点,这样也就需要大量的开发人员,由于手机开发人员稀少,收入比一般pc开发人员会更高。由于现在中国移动的大力推广,如果企业和创业者依托mmarket也会有不错的前景,OPhone作为中国移动大力推广的战略平台潜力巨大。
Android移植除了硬件外最重要的是Java平台之间的移植,目前市面上Java VM主要使用的是Sun公司的Java Micro Edition。而Google Android平台采用的是自己开发的Dalvik。如何从过去J2ME移植到谷歌手机平台呢?
虽然是不同的开发环境,但是所要实现的功能都是相近的,因此从功能的角度可以很好的理解OPHONE OS平台和J2ME平台之间的联系和区别。总结一下,可以发现从以下四个方面可以很好的理解两个平台之间移植。
如果代码框架写得好,逻辑部分基本不需要怎么变化,只需要把和平台相关的接口转换一下就可以了。
1)用户界面
这一点是J2ME移植到Dalvik上最麻烦的地方,Android的图形类和Sun Jave ME有了很大的不同,同时m3到m5 SDK上也有更大改变的趋势,导致了移植时出现很多需要自己去实现相关类,使最终程序的运行效率可能会受影响,真机没有出现的情况下通过开发板可以适当的测试出性能损失。这一点需要花费很长时间去学习,也是未来我们着重需要讲解的。
2)数据存储
这方面就显示出Android 平台比Sun Java强大的地方了,Android平台附带了一个SQLite数据库,和Sun J2ME中的Record Management System (RMS)相比在功能上有了很大的提升,同时在性能上也会有不俗的表现,在过去开发J2ME软件时一直都采取的是如果数据比较简单使用自定义的二进制格式或XML代替。
3)网络数据
这部分Android平台的做法是import Sun中的I/O读写库InputStream这样的类,同时网络相关的仍然采用Sun的URLConnection类进行操作,基本上没有变化,移植时注意下设备的栈空间简单的调整下就可以了。
4)媒体播放
这部分在Android系统上就有了大幅的改变,官方推荐使用MediaPlayer播放类,该类支持mp3、mid、wav、mp4等常规媒体格式的播放,相比J2ME中提供的就灵活强大的多。
下面我们一步一步实现J2ME API在OPHONE OS上的移植。
1、 入口程序MIDlet
学过J2ME的开发人员都知道J2ME有一个主体类MIDlet类,它是程序管理接口,调用startApp(),进入应用程序。
同样,在OPHONE OS平台中同样有一个主体类Activity,调用onCreate(savedInstanceState)进入某个交互界面。
下面我们将通过继承Activity模拟实现J2ME中的MIDlet类和方法。
- public abstract class MIDlet extends Activity {
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- startApp();
- }
- public abstract void destroyApp(boolean unconditional);
- public String getAppProperty(String key) {
- return null;
- }
- public abstract void startApp();
- public void notifyDestroyed() {
- }
- public void notifyPaused() {
- }
- public void pauseApp() {
- }
- public void platformRequest(String URL) {
- }
- public void resumeRequest() {
- }
- }
2、Canvas
同样在J2ME中画板Canvas类与OPhone OS中的View类相似。
- public abstract class Canvas extends Displayable {
- public Canvas(MIDlet context) {
- super(context);
- }
- Graphics g = new Graphics();
- public void onDraw(android.graphics.Canvas canvas) {
- g.bind(canvas);
- paint(g);
- }
- int getGameAction(int keyCode) {
- return 0;
- }
- int getKeyCode(int gameAction) {
- return 0;
- }
- String getKeyName(int keyCode) {
- return "key";
- }
- boolean hasPointerEvents() {
- return true;
- }
- boolean hasPointerMotionEvents() {
- return true;
- }
- boolean hasRepeatEvents() {
- return true;
- }
- protected void hideNotify() {
- }
- boolean isDoubleBuffered() {
- return true;
- }
- protected void keyPressed(int keyCode) {
- }
- protected void keyReleased(int keyCode) {
- }
- protected void keyRepeated(int keyCode) {
- }
- protected abstract void paint(Graphics g);
- protected void pointerDragged(int x, int y) {
- }
- protected void pointerPressed(int x, int y) {
- }
- protected void pointerReleased(int x, int y) {
- }
- void repaint() {
- }
- void repaint(int x, int y, int width, int height) {
- }
- void serviceRepaints() {
- }
- void setFullScreenMode(boolean mode) {
- }
- protected void showNotify() {
- }
- protected void sizeChanged(int w, int h) {
- }
- }
3、Graphics
J2ME 中的Graphics类和OPhone OS中的paint类相似。在移植中,要用OPhone OS类库实现J2ME中的Graphics类,我们在实现的过程中可以对Graphics对象进行修饰,通过整合OPHONE OS 中Canvas并调类库中的Paint类和Color类的方法来实现。比如:
- Graphics
- public class Graphics {
- public final static int VCENTER = 0;
- public final static int TOP = 1;
- public final static int SOLID = 2;
- public final static int RIGHT = 3;
- public final static int LEFT = 4;
- public final static int HCENTER = 5;
- public final static int DOTTED = 6;
- public final static int BOTTOM = 7;
- public final static int BASELINE = 8;
- Canvas dist;
- private final Paint paint = new Paint();
- public void bind(Canvas canvas) {
- dist = canvas;
- }
- public void setColor(int eraseColour) {
- }
- public void drawImage(Image img, int x, int y, int anchor) {
- dist.drawBitmap(img.getTp(), x, y, paint);
- }
- }}
上面是我们重新定义的Graphics类,在其方法的实现上,我们调用了OPHONE OS的一些具体实现方法,从而用OPhone OS类库实现了J2ME的框架,做到了两个平台之间很好的移植。
从上面几个例子可以看出两个平台的框架具有很多相似性,这就为两个平台之间的移植创造了条件。同时我们也会看到,两个平台之间存在一定的差异性,一些在 J2ME中的类和方法无法通过直接继承或者调用OPhone OS来实现,这时候就需要移植人员,自己来实现一些相关的类,这也是移植过程中需要我们去努力克服的困难。
【编辑推荐】