@shellex说: 额....

Posts Tagged ‘j2me’

在Linux下进行JavaME CDC开发

遗憾得很,按照Sun对待Desktop产品的作风,和JavaFX一样,姗姗来迟的Sun Java Toolkits for CDC只有Windows的版本。
看来这个Sun的这个Mobile/Embedded部门对待自家的Solaris也不见的有多友好…所以我们用Linux的同学也沾不到什么光。
不过还好了,PhoneME这个项目的存在真是让人倍感欣慰。于是偶这个用Gentoo的同学才有了在Linux上开发CDC程序的可能性。
在这里已经有前辈做了相关的工作(需翻墙,不是故意要屏蔽小白的):
在ubuntu下用Eclipse开发基于PhoneMe Advance的J2me程序(1)-基本配置
在ubuntu下用Eclipse开发基于PhoneMe Advance的J2me程序(2)-AWT开发
如果懒得翻墙可以听我简单的说下。
phoneME有两个开发版,一个是for CLDC的PhoneME Feature,一个是for CDC的PhoneME Advanced。
那么我需要下载支持CDC的PhoneMe Advanced for Linux的Milestone Releases。如果需要GUI (AWT only),请下载具备 Persoanl  Profile(PP)支持MR1版本,否则就是MR2版本,它不支持PP,只支持Personal Basic Profile。
PhoneMe Advanced Mr2 可以在下载页下载:https://phoneme.dev.java.net/downloads_page.html#advanced
PhoneMe Advanced Mr1 可以在陈旧的下载页下载:https://phoneme.dev.java.net/downloads_previous.html#advanced
然后解压就好。如果是Mr1,选择里面那个pp结尾的目录,里面就是phoneME的runtime。而bin目录下的cvm则是JavaME 虚拟机。
测试一下:
[shellex@gentoo:bin]$ ./cvm -version
Product: CDC AMS 1.0 for PP (b31)
Profile: Personal Profile Specification 1.1
JVM: CDC 1.1.1_01 (interpreter loop)
很好很强大。
写一个巨呆B的Hello World。我还要图形的。很简单的,就俩按钮,一个用来正日,一个用来日成。代码和运行结果如下
package org.demo;

import java.awt.*;
import java.awt.event.*;

public class Test extends [...]

最近做JavaME开发遇到的问题

由于生理上的需求,所以最近需要在手机上搞些开发,于是涉足Java Micro Edition,也就是以前的那个J2ME。
话说我觉得JavaME是做得挺失败的,各大Smartphone的OS都不大鸟他,也就symbian对它好点,C++和J2me的支持基本同步,但是Nokia收购了QT以后还能对它有多好呢?
但是木办法,在iPhone、Android、Win-Mobile、BlackBerry组成围攻之中,破破烂烂的J2ME能生存到现在直到四面楚歌也不容易阿。
不过从技术上说这个玩意还是不错的,可惜哈,可惜哈…SUN是个呆头鸟Geek,不懂得怎么博得MM心。
下面Shellex记录一些从中遇到的问题,当作备忘。
安装WTK啊,配置Eclipse啊,配置EclipseME插件啊之类的屁话就不说了。我采取先描述症状,再说解决方案的叙述方法。
P1: 程序使用第三方库,于是运行时出现巨SB的错误:java.lang.NoClassDefFoundError: XXXXXX
S1: 基本上可以确定了,是由于打包时没有将此第三方库打包进去导致。所以需要在Project的Build path里面的Order And Export里面勾选该第三方库。然后在项目上点右键选择J2ME里面的Create Package即可。关于这个话题,请看这里和这里。
P1+: 恭喜你,你和Shellex一样在Create Package时出错导致无法将第三方包加入生成的jar中。一般来说此时的Eclipse会提示一些很SB的反正我看不懂的错误。
S1+: 这时候还是不依赖IDE比较好。GUI的方式是使用WTK自己的工具ktoolbar。在那里新建一个项目,然后把你的eclipse里面这个项目的内容同步搞过去,然后配置一下,点build。如果出错就改代码,不出错就点运行,没问题就在project菜单里面找Package->Create Package即可。
BTW: 在Linux下,WTK 2.5.2 建立的项目会放在 ~/j2mewtk/2.5.2/apps/ 下。别瞎找。
P2: 如何让模拟器读取本地文件系统?
S2: 开启模拟器以后,菜单MIDLet-> Externel Events的File Connection选项卡即是配置文件系统地方。注意这个鸟地方使用的是相对路径,对应的是~/j2mewtk/2.5.2/appdb/模拟器名称/filesystem/。可以在这里自行添加文件和目录什么的。
P2+: 无法浏览文件,权限不够,模拟器询问时,连允许的选项都没有。
S2+: 在模拟器的首选项的“安全”一节中设置JTWI为trusted或者maximum即可。
P3: 不管在eclipse中运行还是在WTK ktoolbar中运行模拟器,模拟器就一直SB地定在哪儿,屏幕和按键都没有任何反应和响应,直到大约10分钟后,恢复正常。
S3: 因为模拟器在尝试“使用网络”,在/etc/hosts中添加本地主机名到本地回环地址的映射可以解决问题。当然,你断掉网络也行。
cat /etc/hosts
# /etc/hosts: Local Host Database

# IPv4 and IPv6 localhost aliases
127.0.0.1 localhost
::1 localhost
127.0.0.1 shellex-gentoo
P4: 在eclipse中,模拟器启动后马上消失,输出栏说没有找到MIDlets Suit云云。
S4: 在Run Configurations中找到Wireless Toolkits Emulator部分,在MIDlet选项卡的Executable一节中设置MIDlet为com.sun.midp.midlet.Selector或者使用jar直接指定你生成的jar文件。
P5:打包的程序没法在真机上安装,在模拟器上正常。
S5: 检查你的jar中的MANIFEST.MF文件和jad文件是否一致。可能存在的问题是CLDC和MIDP使用的版本不一致导致。解决方法是手工改或者在WTK ktoolbar的Settings的API Selections中确定你选择的Target Platform的支持符合你的预期。

Page 1 of 11