J2ME - 在一个项目中支持不同的平台

时间:2014-08-20 09:05:39

标签: java java-me project

我正在J2ME中开发一个应用程序,它将部署在不同的平台上(全部支持J2ME)

对于UI,我将使用LWUIT并确保它在每个平台上渲染大致相同。 (LWUIT是跨平台的)

我知道每个平台都有自己的细微差别,例如库的可用性/缺失,我想知道最好的行动方案是

A)为每个平台创建一个新项目(例如一个用于Blackberry,一个用于诺基亚),并在它们之间复制并粘贴类似的可重用代码;基本上保持4-5个类似的代码库。

OR

B)有一个大项目充斥着"如果"或"开关"说(IF平台== x然后做xx)。

任何人都可以告诉我,如果上面有一些严重的愚蠢的疏忽,我不会接受?我倾向于实施A,但我认为两者都有一些可维护性问题。

非常感谢

菲尼克斯

2 个答案:

答案 0 :(得分:1)

维护多个代码库是大多数开发人员更愿意避免的问题。

Afaik大多数开发人员使用预处理器,这基本上允许您在代码中使用大量if句子,而不会使jar文件变大。

我在所有JavaME游戏项目中都使用了预处理,能够使用一个代码库编译到多个目标。

//#if ScreenWidth==240
tilesize = 16;
spriteSheet = Image.createImage("sprites16x16");
//#endif
//#if ScreenWidth==640
tilesize = 32;
spriteSheet = Image.createImage("sprites32x32");
//#endif

您可能没有听说过预处理,因为它通常不用于Java。但是将它用于JavaME是有道理的,因为设备中存在碎片。我也喜欢能够对Android项目使用预处理,但遗憾的是,这还不可能。

其他小事,例如诺基亚UI的存在,不需要预处理。只需使用classForname来检查类是否存在,如果是,则将布尔值设置为true。然后在代码中使用此布尔值来检查是否应该执行某段代码。 (例如,我使用Nokia-UI API保持屏幕活跃,因为此API存在于诺基亚和索尼爱立信设备上。)

try {
  Class.forName("com.nokia.mid.ui.DeviceControl");
  nokiaui = true;
} catch (Exception e) {}

然后在我的游戏循环中:

if (nokiaui) {
  com.nokia.mid.ui.DeviceControl.setLights(0, 100);
}

可以将这样的内容放在预处理块中,但是你会错过可能支持它的设备。

答案 1 :(得分:1)

这总是支持多个平台。

你可以从LWUIT中获取灵感,因为你已经提到了它(https://java.net/projects/lwuit/sources/svn/show/trunk?rev=1653)。这是一个巨大的代码库,它需要时间来遵循它。主要思想是模块化项目,并通过接口和实现隐藏平台特定的细节。并在运行时或编译时通过依赖注入进行配置。

例如,您有Client类,它将通过http与服务器通信。所以你可能会有下一个结构:

common
  Client
  Network

j2me
  J2MENetwork extends Network
  J2MEMidlet
blackberry
  BlackBerryNetwork extends Network
  BlackBerryApp

因此Network将是抽象类,并且将有一些关于使用重试构建URL的常见逻辑。 BlackBerryNetwork将使用特定于平台的API进行网络通信。 Client将在J2MEMidletBlackBerryApp中注入正确的实施内容。

建议: 1)不要复制你的代码。维护一个代码库 2)我真的反对预处理。因此,如果根本无法避免它,请尝试将所有预处理集中在一两个工厂类

中 祝你好运,我的祝福!