使用Eclipse为Nokia设备开发移动应用程序

源自:http://www6.software.ibm.com/developerworks/cn/education/java/wi-nokiaecl/tutorial/index.html

关于本教程第 1 页(共3 页)


本教程将展示如何使用 Eclipse IDE 和 Nokia Developer's Suite for J2ME 为 Nokia 手机开发 J2ME 应用程序。

本教程是为那些有兴趣利用功能强大的 Eclipse IDE 提高生产率的 J2ME 和 Nokia 开发人员准备的。本教程所针对的读者还包括那些想走捷径快速入门 Nokia 设备的实际移动应用程序开发的 Java Eclipse 开发人员。尽管 Nokia Developer's Suite for J2ME 主要是为 Nokia 手机开发人员提供工具,但您也可以将它用于其他设备的一般性 J2ME 应用程序开发。Eclipse 和 J2ME 的基础知识将帮助您完成本教程描述的任务。

先决条件第 2 页(共3 页)


要完成这些任务和运行本教程中的示例代码,需要安装 Eclipse IDE Version 2.1.x 或 3.x。还需要在 Nokia 论坛(http://www.forum.nokia.com/)注册一个免费用户帐号。我将在本教程中介绍如何下载和安装 Nokia Developer's Suite for J2ME。

关于作者第 3 页(共3 页)


Michael Juntao Yuan 博士是端到端移动解决方案的创造者、分析家和开发人员。他在 J2ME、J2EE 和 .Net 技术方面有丰富的经验。Michael 在一些领先的技术和学术期刊上发表过 30 多篇与移动有关的文章。他还是以下两本书的作者:Enterprise J2ME(Prentice Hall, 2003)和 Developing Scalable Series 40 Applications(Addison-Wesley and Nokia, 2004)。

有关本教程内容的技术问题和意见,请通过 michael.yuan@enterprisej2me.com 与作者 Michael J. Yuan 联系,或者单击任一屏顶部的“反馈”。

什么是 J2ME?第 1 页(共4 页)


Java 2 Platform, Micro Edition(J2ME)是运行在移动设备上的 Java 平台。它支持标准的 Java 编程语言,包含来自 Java 2 Platform, Standard Edition(J2SE)的 API 子集,以及一些特定于设备的 API。移动信息设备配置文件(Mobile Information Device Profile,MIDP)是一种运行在移动电话上的 J2ME,可用于 2.5 亿多部手机上,是目前可以获得的最普遍使用的计算平台。本教程将重点研究 MIDP 应用程序开发。关于 J2ME 和 MIDP 的更多信息,请参阅 IBM developerWorks 出版的“J2ME 101”教程系列(请参阅 参考资料)。

 

Eclipse 和 J2ME第 2 页(共4 页)


开源 Eclipse IDE 已经成为供许多 Java 开发人员选择的开发工具之一。此外,Eclipse 还为一些关键的 IDE 特性提供了极好的支持,这些特性包括团队协作、上下文相关的代码编辑器、重构、单元测试、调试和项目管理,等等。但更重要的是,Eclipse 支持允许第三方供应商在其上构建专用工具(插件)的应用程序平台。例如,许多 Eclipse 插件可用于辅助 J2EE 应用程序开发、虚拟建模、测试、代码分析和类似的更多操作。

不过。对于移动电话开发人员,Eclipse 的威力一直让人捉摸不定,直到最近,这种情况才得以改观。长期以来,IBM WebSphere® Studio Device Developer(Device Developer)一直是支持 J2ME 开发的惟一基于 Eclipse 的 IDE。设备开发人员支持来自 IBM 的 J2ME 实现,即 WebSphere Micro Environment。移动电话开发人员需要一个低成本的 Eclipse 插件,支持手机制造商提供的真实设备 MIDP SDK。现在,让我们进入 Nokia Developer's Suite for J2ME。

 

Nokia 开发人员平台第 3 页(共4 页)


作为世界上最大的移动电话制造商,Nokia 随时都会生产出几十种手机模型。对于开发人员而言,这可能是一种让人感到非常困惑的场景。因为研究每个设备的特征以及可在每个设备上使用的编程环境要花费大量的时间。

为了让开发人员活得轻松点,Nokia 只围绕几种开发人员平台设计它的手机。每种开发人员平台都包含一些具有类似的物理特征(比如屏幕大小和内存大小)、UI 风格、主流软件和编程环境的设备。

  • Nokia Series 40 Developer Platform 适用于大量销售的设备,比如 Nokia 7210 和 6230。它拥有最大的市场份额,每年可销售 1 亿部 Series 40 设备。
  • Nokia Series 60 Developer Platform 适用于基于 Symbian-OS 的智能电话设备,比如 Nokia 3650 和 6600。每年大约可销售 1 千万部 Series 60 设备。
  • Nokia Series 80 Developer Platform 适用于基于 Symbian-OS 的高端企业设备,比如 Nokia 9500 和 9300 Communicators。
  • Nokia Series 90 Developer Platform 适用于基于 Symbian-OS 的触摸屏多媒体设备,比如 Nokia 7700 原型设备。目前还没有使用 Series 90 平台的商业设备。

J2ME 在所有的 Nokia 开发人员平台上都受到支持。Series 40、60、80 和 90 平台的 2.0 版本全都支持 MIDP 2(即 Wireless Messaging API)和 Mobile Multimedia API。它们还提供了对 Bluetooth API、Mobile 3D API、File I/O 和 PIM API 的可选支持。

 

Nokia 设备 SDK第 4 页(共4 页)


设备 SDK 包含可用的 Java API 库,以及用于特殊设备的 PC 仿真器。该仿真器在开发用的 PC 上模拟物理设备的特征和限制。SDK 是开发实际设备应用程序的一个重要工具。

因为新设备的发布非常迅速,所以对于 Nokia 而言,为每种设备开发单独的 SDK 有些不切实际。因此,它只为有代表性的设备发布 SDK。例如,Nokia Series 40 Developer Platform 2.0 SDK 是以 Nokia 6230 设备为基础,可以用来为 Nokia 5140、3220 和 6255 设备开发 MIDP 应用程序。该 SDK 也正是您在本教程中要用到的 SDK。

Nokia Developer's Suite for J2ME 为安装在开发 PC 上的所有 SDK 提供了一个管理接口。

 

下载 Nokia Developer's Suite 2.2 for J2ME第 1 页(共6 页)


您可以从 Nokia 论坛的工具专区下载免费的 Nokia Developer's Suite for J2ME,网址是 http://www.forum.nokia.com/tools。Nokia Developer's Suite for J2ME Version 2.2 及其更高版本都支持 Eclipse 集成。在下载页上,选择 Request serial number for this product 链接,以获得邮寄到您用 Forum Nokia 帐号注册的电子邮件地址的序列号。安装的时候需要这个序列号。


 

安装 Nokia Developer's Suite Version 2.2 for J2ME第 2 页(共6 页)


在开始运行下载的安装程序之前,必须先卸载 所有以前安装的 Nokia Developer's Suite for J2ME 版本。然后需要输入您在 Nokia 论坛中使用的用户名和请求(并通过电子邮件接收)的序列号。在获得提示的时候,应该选择将该套件与 Eclipse 集成。还需要告诉安装程序您安装 Eclipse 的根目录。


 

启动 Eclipse第 3 页(共6 页)


现在,启动 Eclipse IDE ,您会在工具栏上看到一个新的 Tools > Nokia Developer's Suite for J2ME 菜单项和一个新的图标编号。

图 1. Eclipse 中的新菜单 

 

下载新的 SDK第 4 页(共6 页)


Nokia Developer's Suite for J2ME 是随同以下设备 SDK一起提供的:

  • Series 40 Developer Platform 2.0 SDK V1.0
  • Series 60 MIDP Concept SDK beta 0.3.1, Nokia Edition

Series 40 SDK 在默认情况下使用。您可以从位于 http://www.forum.nokia.com/tool 的 Nokia 论坛的工具专区下载更多的设备 SDK。每个 SDK 需要一个单独的序列号。SDK 通常安装在 Windows PC 的 C:/Nokia/Devices/ 目录中。


将 SDK 添加到 Nokia Developer's Suite 中第 5 页(共6 页)


您可能必须手工将新的 SDK 添加到 Nokia Developer's Suite 中。为了做到这一点,需要执行以下步骤:

  1. 选择 Tools > Nokia Developer's Suite for J2ME > Configure Emulators
  2. 单击 Add 将新的 SDK 添加到下拉列表中。

    图 2. 添加新的 SDK 

  3. 选择将添加 SDK 的安装目录。

    图 3. 选择 SDK 的安装目录 


配置仿真器第 6 页(共6 页)


要配置设备仿真器的行为,请执行以下操作:

  1. 选择 Tools > Nokia Developer's Suite for J2ME > Configure emulators
  2. 从下拉列表中选择 SDK 仿真器。
  3. 单击 Preference。您就能够设置该仿真器的一般属性。

Phone Number prefix 字段指定了模拟电话网络环境时为仿真器分配的假的电话号码。例如,仿真器的第一个实例是分配电话号码“6230000”,第二个实例是分配“6230001”。这两个仿真器实例可以使用这些电话号码彼此发送 SMS/MMS 消息。

图 4. 一般属性 

MIDP 的运行时属性(比如堆的大小和安全域)也可以配置。

图 5. 配置 MIDP 

可以在 MIDP Monitor 选项卡中指定仿真器的日志级别。在这里,您还可以降低仿真器的执行速度,在快速 PC 的设备上模拟慢速 CPU。

图 6. 日志级别 

您已经安装了这些工具。现在,让我们来经历一下使用这些工具构建、测试和部署 MIDP 应用程序的完整过程。

 

启动新的项目第 1 页(共3 页)


要启动新的项目,请执行以下步骤:

  1. 选择 New > Project
  2. 选择 Nokia J2ME 的项目类型。

    图 7. 选择项目类型 

  3. 为该项目指定一个名称和一个根目录。

    图 8. 创建项目名 

  4. 如果有一些 SDK 可用的话,选择一个 SDK 进行开发。

    图 9. 选择一个 SDK 


配置项目路径第 2 页(共3 页)


您可以在项目中指定放置 Java 源文件和编译好的类文件的地方。在这里,只需使用 Eclipse 的默认设置即可。

图 10. 构建路径中的源文件夹 

在默认情况下,项目的类路径中包括 SDK 中的 J2ME API 库。可以将任意外部库添加到类路径中。警告:如果您想添加那些在该项目的物理设备上不可用的外部 Java Archive(JAR)库,那么必须手工将它们打包到发行版本的 JAR 文件中。否则,MIDlet 会在您在设备上部署这些库的时候抛出“Class not found”异常。

图 11. 定义类路径 


在 Package Explorer 中查看项目第 3 页(共3 页)


现在,您已经结束了项目的安装。项目名显示在 Project Explorer 中。源代码目录和类库是项目名下的一个级别。您可以通过单击打开类库并浏览其内容。这个类库包含 J2ME API 类和 Nokia 的实现类。您甚至可以通过在 Java 编辑器中反编译某些单独类的接口来检查这些类。

图 12. 在 Package Explorer 中查看 


Eclipse 的新的类向导第 1 页(共6 页)


尽管 Nokia 插件为生成新的类在 Tools > Nokia Developer's Suite for J2ME中提供了一个向导,但我更喜欢使用 Eclipse 的默认向导,因为它支持超类和已实现接口的自动代码完成(automatic code completion)。

图 13. 新类 

从该向导中生成的主要 Java 源代码文件如下所示:

图 14. 生成的源代码 


TutorialMidlet 类第 2 页(共6 页)


TutorialMidlet 类是为应用程序提供输入执行的类。Java 运行时环境(Java Runtime Environment,JRE)首先会实例化这个类,然后调用其 startApp() 方法启动 midlet。在用户终止应用程序时,可以调用 destroyApp() 方法。

TutorialMidlet 类控制并显示应用程序中的所有 UI 屏幕。所有用户生成的软键(soft-key)事件(比如用户按下一个软键时)都由 TutorialMidlet 类处理,因为它实现了 CommandListener 接口,并将自己作为所有屏幕对象的命令监听程序附加到该接口上。UI 事件回调方法是 commandAction()


package tutorial;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class TutorialMidlet extends MIDlet
                          implements CommandListener {
  Display display;
  Command greetCommand;
  Command exitCommand;
  Command clearCommand;
  Command backCommand;
  WelcomeScreen welcomeScreen;
  HelloScreen helloScreen;
  // instantiate the internal variables
  public TutorialMidlet () {
    display = Display.getDisplay(this);
    greetCommand =
        new Command ("Greet", Command.OK, 0);
    exitCommand =
        new Command ("Exit", Command.EXIT, 0);
    clearCommand =
        new Command ("Clear", Command.CANCEL, 1);
    backCommand =
        new Command ("Back", Command.SCREEN, 1);
    welcomeScreen = new WelcomeScreen ();
    welcomeScreen.addCommand (greetCommand);
    welcomeScreen.addCommand (clearCommand);
    welcomeScreen.setCommandListener (this);
    helloScreen = new HelloScreen ();
    helloScreen.addCommand (exitCommand);
    helloScreen.addCommand (backCommand);
    helloScreen.setCommandListener (this);
  }
  // Called when the MIDlet is started by the AMS
  protected void startApp () {
    display.setCurrent (welcomeScreen);
  }
  protected void pauseApp () {
    // Do nothing
  }
  protected void destroyApp (boolean unconditional) {
    notifyDestroyed ();
  }
  public void commandAction (Command c, Displayable d) {
    if (c == greetCommand) {
      String name = welcomeScreen.getName ();
      helloScreen.setName(name);
      display.setCurrent (helloScreen);
    } else if (c == clearCommand) {
      welcomeScreen.setName("");
      display.setCurrent(welcomeScreen);
    } else if (c == backCommand) {
      display.setCurrent (welcomeScreen);
    } else if (c == exitCommand) {
      destroyApp (true);
    }
  }
}

 

实时错误检验第 3 页(共6 页)


TutorialMidlet 类使用 WelcomeScreen 和 HelloScreen 类,这些类您也必须键入。Eclipse 中的高级 Java 编辑器会用红色线条(red bar)标出相关的代码路径,警告您存在这类冲突。如果您将鼠标放在红线上,编辑器会显示一个解释框,告诉您为什么它认为这是一个错误。实时语法检验允许开发人员利用 Java 编译器的一致性检验功能,而不用实际等待编译的完成。

图 15. 实时错误检验 

如果选定 Eclipse Project 菜单中的 Build automatically 选项,那么每当更新项目时,Eclipse 都会试着不断在后台构建该项目。在这种情况下,Package Explorer 也会显示在构建过程中检测到的编译错误。

图 16. 自动构建错误 


WelcomeScreen 类第 4 页(共6 页)


WelcomeScreen 类扩展了 Form 类来展示包含一些高级 MIDP UI 组件的屏幕。正如您已经看到的,WelcomeScreen 的软键命令和事件处理程序被添加在 TutorialMidlet 类中。可以通过 JavaBeans 风格的 get 和 set 方法,从这个类的外部访问 nameField UI 组件中的数据。以这种形式使用的图像来自外部的 PNG 图像文件welcome.png。该文件必须位于 midlet 的运行时类路径中,以便对它进行访问。


package tutorial;
import javax.microedition.lcdui.*;
public class WelcomeScreen extends Form {
  private TextField nameField;
  public WelcomeScreen () {
    super ("Welcome");
    Image img;
    // Construct the image from the media file
    try {
      img = Image.createImage("/welcome.png");
    } catch (Exception e) {
      e.printStackTrace ();
      img = null;
    }
    ImageItem imageItem =
        new ImageItem ("", img,
              ImageItem.LAYOUT_CENTER, "Welcome");
    nameField =
        new TextField ("Please enter your name", "",
                       10, TextField.ANY);
    append (imageItem);
    append (nameField);
  }
  public void setName (String n) {
    nameField.setString (n);
  }
  public String getName () {
    return nameField.getString ();
  }
}

    
    
HelloScreen 类第 5 页(共6 页)


HelloScreen 类扩展了Canvas 类来展示必须通过应用程序自身得到渲染的屏幕。paint() 方法重新绘制了整个屏幕,每次屏幕需要更新时,都由系统调用该方法。再次声明,HelloScreen 的软键命令和事件处理程序被添加在 TutorialMidlet 类中。屏幕上渲染的名称字符串是通过 setName() 方法在显示该屏幕之前设置的。图像文件 hello.png 也必须位于 midlet 运行时类路径中。


package tutorial;
import javax.microedition.lcdui.*;
public class HelloScreen extends Canvas {
  private int width, height;
  private String name;
  private Image img;
  public HelloScreen () {
    width = getWidth ();
    height = getHeight ();
    name = "unknown";
    // Construct the image from the media file
    try {
      img = Image.createImage("/hello.png");
    } catch (Exception e) {
      e.printStackTrace ();
      img = null;
    }
  }
  public void setName (String n) {
    name = n;
  }
  // Paint the screen based on the name
  protected void paint (Graphics g) {
    g.setColor(0xffffff);
    g.fillRect(0,  0, width, height);
    g.setColor(0x000000);
    g.drawImage (img, width / 2, height / 4,
            Graphics.VCENTER | Graphics.HCENTER);
    g.setFont(Font.getFont(
                Font.FACE_PROPORTIONAL,
                Font.STYLE_BOLD,
                Font.SIZE_LARGE));
    g.drawString (name, width / 2, height * 3/4,
            Graphics.BASELINE | Graphics.HCENTER);
  }
}

不再有错误第 6 页(共6 页)


键入所有的源代码,如果 Eclipse 没有显示任何错误或不一致,您就已经为运行 midlet 做好了准备!

图 17. 没有错误,运行 midlet

复制资源文件第 1 页(共3 页)


WelcomeScreenHelloScreen 类使用了两个外部图像文件。这两个文件都必须位于 midlet 的运行时类路径中。不幸的是,从 Eclipse IDE 内部访问运行时类路径(项目中的 bin 目录)不是一件很容易的事;必须从 IDE 的外部复制这些文件。

图 18 展示了 Windows 文件浏览器中的 bin 目录。

图 18. 复制资源文件

运行 midlet第 2 页(共3 页)


要在仿真器中运行 midlet,首先要在 Package Explorer 中选择目标 MIDlet 类(这里是 TutorialMidlet类),然后选择 Run > Run As > Nokia SDK

图 19. 运行 midlet

查看操作中的仿真器第 3 页(共3 页)


正如配置中所指定的那样,仿真器是从一个诊断窗口开始的。

图 20. 从一个诊断窗口开始的仿真器

该仿真器响应用户的输入。

图 21. 响应用户输入的仿真器

设置调试器第 1 页(共3 页)


Nokia 设备 SDK 提供了有限的调试功能。您可以使用 Eclipse 的插件调试器来收集调试信息,并与 SDK 仿真器进行交互。

首先,您必须在 Windows > Preferences 窗口中设置调试器。您应该取消所有处于挂起状态的选项的选定,并将调试器的超时时间增加到 20,000 毫秒。

图 22. 设置调试器

设置中断点第 2 页(共3 页)


使用 Eclipse 的 Run 菜单,您可以设置中断点,并在源代码编辑器中观察游标所在位置上的中断点。因为 Nokia SDK 中有一个 bug,进入方法可能导致仿真器崩溃,所以,您应该只设置方法中断点。

图 23 显示了一个方法中断点,该中断点正如编辑器左边绿色点所指出的那样。为了使其生效,您还必须为该中断点重新构建应用程序。

图 23. 设置一个中断点

运行调试器第 3 页(共3 页)


现在,您可以使用 Run > Debug ... 在调试模式下运行 midlet。仿真器启动正常,但当您击中该中断点的时候(比如说这里按下软键来调用方法处理程序的 commandAction() 方法),Eclipse 会将它的显示从 Java 透视图更改为调试透视图。它将显示调用堆栈、当前中断点和堆栈中的变量值。在回顾了这些数据之后,您就可以使用 Run 继续您的执行操作。

图 24. 调试透视图

生成 JAR 和 JAD 文件第 1 页(共7 页)


为了在实际的硬件设备上运行 midlet,必须将它们打包到 JAR 和 JAR 描述符(JAD)文件对中,这两个文件是随 J2ME 空中下载(Over-The-Air,OTA)应用程序自动配置规范一起提供的。可以使用 Tools > Nokia Developer's Suite for J2ME > New Application Package 向导来生成 JAR 和 JAD 文件。您可以选择生成新的文件对,或者编辑现有的文件对。

图 25. 新的 JAR 和 JAD 文件对

定制属性第 2 页(共7 页)


您可以在 JAD 和 JAR 清单文件中定制 midlet 名称、描述、版本号和其他许多属性,其中包括用户定义的属性。您还可以控制 JAR 文件中包含哪些类和资源文件。

图 26. 编辑 JAR/JAD 属性

预览 JAR/JAD 文件第 3 页(共7 页)


单击 Preview 来预览 JAD 和 JAR 清单文件。

图 27. 预览 JAR/JAD 清单文件

生成文件第 4 页(共7 页)


单击 Generate 来实际地生成 JAD 和 JAR 文件。您可以在项目根目录中替换生成的文件。

图 28. 生成实际的 JAR/JAD 文件

为包签名第 5 页(共7 页)


使用 Tools > Nokia Developer's Suite for J2ME > Sign Application Package 向导,可以对 midlet 进行数字签名,以便将其发布。该向导允许您导入自己的数字证书。它为 JAR 清单和 JAD 文件添加了数字签名和相关的公钥证书。

图 29. 为应用程序包进行签名

测试仿真器中的包第 6 页(共7 页)


使用 Tools > Nokia Developer's Suite for J2ME > Start Emulators 向导,您可以在设备仿真器中测试运行 JAD 文件。这个 JAR 文件在 JAD 文件中提到过。您可以对相同的 midlet 启动多个仿真器实例。每个仿真器实例都有一个不同的假的电话号码。

图 30. 为进行测试而运行 JAD 文件

在仿真器中测试 OTA第 7 页(共7 页)


使用 Tools > Nokia Developer's Suite for J2ME > Start Emulators 向导,您还可以在设备仿真器中测试 JAD 和 JAR 文件的 OTA 配置。仿真器试图从 URL 安装 JAD 文件,并通过安全和权限检验来查看它是否是一个 OTA midlet,而不用直接运行 JAD 文件。

图 31. 测试 JAR/JAD 文件的 OTA 配置

在局域网上进行部署第 1 页(共2 页)


有了 JAR 和 JAD 文件,您就可以使用 Tools > Nokia Developer's Suite for J2ME > Deployment 向导,通过串行连接和蓝牙连接将它们推(push)向电话。被推的(pushed)应用程序将安装在电话上。

图 32. midlet 的局域网安装

在 OTA 服务器上进行部署第 2 页(共2 页)


为了将 midlet 推向本地串行网络和蓝牙网络之外的一般公众,必须在公共 OTA 服务器上放置 JAD 和 JAR 文件,这样,任何移动用户都可以通过无线数据网下载和安装它。该部署向导支持使用 FTP 将这些文件复制到将 OTA 服务器作为主机的 ISP。它自动生成一个 WML 文件,该文件包含到 JAD 文件的链接。当移动用户通过电话或者单击该链接,从他们自己的 WML 浏览器访问这个 WML 页面时,会自动触发电话安装 midlet。

图 33. 将 midlet 传输到 OTA 服务器

结束语第 1 页(共3 页)


在本教程中,我带您遍历了下载、安装和配置作为 Eclipse IDE 插件的 Nokia Developer's Suite for J2ME 的整个过程。然后,我介绍了使用这个工具开发、测试和部署 midlet 应用程序的步骤。

在完成本教程中的所有任务之后,您应该很好地了解了如何将 Nokia Developer's Suite for J2ME 与 Eclipse 一起使用,以及如何利用这两种工具的关键特性提高 J2ME 应用程序开发的生产率。

参考资料第 2 页(共3 页)


  • 下载本教程中使用的例子的 完整的源代码。(ftp://www6.software.ibm.com/software/developer/library/wi-nokiaeclsource.zip)
  • 可以从 Eclipse 网站下载 Eclipse IDE。这个网站上还有一些关于如何使用 Eclipse IDE 和如何开发插件的文档。(http://www.eclipse.org/)
  • Nokia 论坛的工具专区中有 Nokia Developer's Suite 2.2 for J2ME 和相关的设备 SDK ,可以免费下载它们。(http://www.forum.nokia.com/tools)
  • IBM developerWorks 上的 J2ME 101 教程系列是一个开始了解 J2ME 和 MIDP 编程的好地方。
  • IBM WebSphere Studio Device Developer 是另一个基于 Eclipse 的商业 IDE,针对的是 J2ME 开发人员。(http://www-306.ibm.com/software/wireless/wsdd/)

 

反馈第 3 页(共3 页)


请告诉我们本教程是否对您有用,以及如何改进。我们非常期望了解您希望介绍哪些主题的教程。

有关本教程内容的问题,请通过 michael.yuan@enterprisej2me.com 与作者 Michael J. Yuan 联系。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值