What is Java 2 Micro Edition?

advertisement
http://www.developer.com/java/j2me/article.php/1443961
What is Java 2 Micro Edition?
By Eric Giguère
Java is known primarily as a server-side programming environment, centered around the technologies that make
up the Java 2 Enterprise Edition (J2EE), such as Enterprise JavaBeans (EJBs), servlets, and JavaServer pages
(JSPs). Early adopters of Java, however, will recall that it was originally promoted as a client-side application
environment. In fact, Java was originally designed as a programming language for consumer appliances. Now
Java is returning to its roots with Java 2 Micro Edition, or J2ME for short. This article, the first in a series on
J2ME programming, explains what J2ME is.
The Java 2 Platform
What we commonly refer to as "Java" is more formally known as the Java 2 Platform. The Java 2 Platform is
split into three editions: Java 2 Standard Edition (J2SE), Java 2 Enterprise Edition (J2EE), and Java 2 Micro
Edition (J2ME). Each edition of the platform provides a complete environment for running Java-based
applications, including the Java virtual machine (VM) and runtime classes.
The three editions all target different kinds of applications running on different kinds of devices. Desktop-based
applications are developed using J2SE, which provides the necessary user interface classes. Server-based
applications are developed using J2EE, which emphasizes component-based programming and deployment.
Handheld and embedded devices are targeted by J2ME.
What separates one edition from another, then, is primarily the set of class libraries that each edition defines.
Loosely speaking, you can think of J2ME as a subset of J2SE and J2SE as a subset of J2EE. It is possible to run
the same Java bytecode in each edition, providing the classes referred to by the bytecode are available in all three
editions. The catch, of course, is that J2ME-based devices have fewer classes than what J2SE and J2EE provide,
especially the smaller devices. After all, there are several thousand core J2SE runtime classes, taking up ten to
twenty megabytes of space, which is simply too big for the majority of devices out there today and in the near
future.
The various specifications that comprise J2ME are all defined through the Java Community Process (JCP), as is
done with J2SE and J2EE. Today, there are close to forty separate Java Specification Requests (JSRs) dealing
with J2ME: Small device programming is definitely a hot topic within the Java community. (For more
information, see the main JCP Web site at www.jcp.org.)
Java 2 Micro Edition
In J2ME, the Java runtime environment is adapted for constrained devices - devices that have limitations on
what they can do when compared to standard desktop or server computers. For low-end devices, the constraints
are fairly obvious: extremely limited memory, small screen sizes, alternative input methods, and slow
processors. High-end devices have few, if any, of these constraints, but they can still benefit from the optimized
environments and new programming interfaces that J2ME defines.
Learning about J2ME is not hard: Once you understand the new terminology, it's mostly about learning new
APIs (application programming interfaces) and learning how to work in constrained environments. (If you think
writing an applet is challenging, wait until you try to fit an application into the 30K of memory some cellphones
provide!) You can use most of the same tools you already use in your code development, and with careful coding
you can develop libraries of classes that are portable to any device or computer with a Java virtual machine.
PersonalJava and EmbeddedJava
J2ME is not the first attempt at adapting Java for constrained environments. Two other technologies,
PersonalJava and EmbeddedJava, made it possible to run Java 1.1.x applications on high-end devices.
PersonalJava uses the basic Java 1.1 runtime classes and throws in a few features from Java 2. Support for some
of the runtime classes is optional, but a PersonalJava implementation still requires a couple of of megabytes of
memory and a fast processor to run, so it's not a practical solution for truly constrained devices like cellphones
and many personal digital assistants.
EmbeddedJava makes every behavior of both the Java VM and the runtime classes optional - the implementor
can choose exactly which classes and methods are required. There is one limitation, however: The Java runtime
environment can only be used by the implementor and cannot be exposed to third parties. In other words, you
can use it to write Java code that runs inside a device, usually as part of the software to control the device, but no
one else can write applications for the device. This is done to preserve the "write once, run anywhere" nature of
Java, since an EmbeddedJava environment can do away with fundamental things like runtime class verification
and change the public interfaces of core classes. EmbeddedJava is really a way to build a "private" Java runtime
environment.
Both PersonalJava and EmbeddedJava are being phased out. There is a migration path from PersonalJava to
J2ME, as we'll see later in this series, though the current version of PersonalJava continues to be supported.
EmbeddedJava is no longer supported because J2ME defines suitable small-footprint runtime environments.
What's Next
In the next article, we'll examine the core concepts of J2ME - configurations, profiles, and optional packages and some other terms like KVM and CVM. You can't write a J2ME application without knowing which
configuration and profile you're targeting, or knowing which optional packages are required, so it's important to
understand the terminology before you attempt your first application.
If you can't wait to get started with J2ME, download Sun's J2ME Wireless Toolkit and read through some of the
extensive J2ME documentation on the Sun Web site.
J2ME Core Concepts
At the heart of Java 2 Micro Edition (J2ME) are three core concepts: configurations, profiles, and optional
packages. You can't write a J2ME application without understanding these concepts, because they determine the
features of Java that you can use, which application programming interfaces (APIs) are available, and how your
applications are packaged.
Configurations
A configuration is a complete Java runtime environment, consisting of three things:
* A Java virtual machine (VM) to execute Java bytecode.
* Native code to interface to the underlying system.
* A set of core Java runtime classes.
To use a configuration, a device must meet certain minimum requirements as defined in the configuration's
formal specification. Although a configuration does provide a complete Java environment, the set of core classes
is normally quite small and must be enhanced with additional classes supplied by J2ME profiles or by
configuration implementor. In particular, configurations do not define any user interface classes.
J2ME defines two configurations, the Connected Limited Device Configuration (CLDC) and the Connected
Device Configuration (CDC). The CLDC is for very constrained (limited) devices -- devices with small amounts
of memory and/or slow processors. The VM used by the CLDC omits important features like finalization, while
the set of core runtime classes is a tiny fraction of the J2SE core classes, just the basics from the java.lang,
java.io and java.util packages, with a few additional classes from the new javax.microedition.io package. The
CDC, on the other hand, includes a full Java VM and a much larger set of core classes, so it requires more
memory than the CLDC and a faster processor. The CDC is in fact a superset of the CLDC. We'll discuss the
configurations in detail in the next two articles in this series.
Profiles
A profile adds domain-specific classes to a configuration to fill in missing functionality and to support specific
uses of a device. For example, most profiles define user interface classes for building interactive applications.
To use a profile, the device must meet all the minimum requirements of the underlying configuration as well as
any additional requirements mandated by the profile's formal specification.
There are several profiles in various stages of development. The first profile to be released was the Mobile
Information Device Profile (MIDP), a CLDC-based profile for running applications on cellphones and
interactive pagers with small screens, wireless HTTP connectivity, and limited memory. Another CLDC-based
profile under development is the Personal Digital Assistant Profile (PDAP), which extends MIDP with additional
classes and features for more powerful handheld devices. In terms of CDC-based profiles, the Foundation Profile
(FP) extends the CDC with additional J2SE classes, the Personal Basis Profile (PBP) extends the FP with
lightweight (AWT-derived) user interface classes and a new application model, and the Personal Profile extends
the PBP with applet support and heavyweight UI classes. We'll also be discussing these profiles later on in this
series.
Optional Packages
An optional package is a set of APIs in support of additional, common behaviors that don't really belong in one
specific configuration or profile. Bluetooth support, for example, is defined as an optional package. Making it
part of a profile wouldn't work, because none of the behaviors of a profile can be optional -- if a device supports
a profile, it must support the entire profile -- and that would limit the profile to Bluetooth-enabled devices.
Optional packages have their own minimum requirements, of course, just like configurations and profiles.
Optional packages also have specific dependencies on a particular configuration and/or one or more profiles -they do not define a complete runtime environment, just sets of related APIs.
There are many optional packages in development, including the RMI Optional Package, which adds RMI
support to CDC/FP-based profiles, the Java APIs for Bluetooth, which adds Bluetooth support to CLDC-based
profiles, and the JDBC Optional Package for CDC/Foundation Profile, which defines a subset of JDBC (database
access APIs) for use with CDC/FP-based profiles. Again, we'll be covering these later on in the series as the
need arises.
The KVM and CVM
Two other terms you'll see mentioned in J2ME literature are KVM and CVM. These are the names of Java
virtual machines for the CLDC (KVM) and the CDC (CVM), written specifically to work in the constrained
environment of a handheld or embedded device and to be easily ported to different platforms. It should be noted,
however, that the CLDC and CDC specifications do not require the use of the KVM or the CVM, only the use of
a VM that adheres to the requirements of the specification in question. While many device manufacturers license
the KVM or CVM from Sun Microsystems to serve as the core of their J2ME implementation, they are not
required for J2ME compliance. It is a mistake, therefore, to consider the CLDC and KVM as synonymous, and
similarly for the CDC and the CVM.
What It All Means
It should now be apparent that "J2ME application" is an ambiguous term. For what profile is the application
intended? Which optional packages does it require? How much memory does it take? These are the questions
you must ask yourself before you start application development, because they determine which language features
and which classes your application can use. If you limit your application to CDC-based profiles, for example,
you make development simpler of the many familiar J2SE APIs, but you cut out the low-end devices from your
potential install base. Targeting CLDC-based profiles, on the other hand, makes your development task harder,
especially when trying to shrink the size of your application to run on as many of the smaller devices as possible.
These are the kinds of tradeoffs you'll have to make as you begin to work with J2ME. The information in this
series will help you decide what's really important.
The Connected Limited Device Configuration (CLDC)
At the core of Java 2 Micro Edition (J2ME) are the configurations, the specifications that define the minimal
feature set of a complete Java runtime environment. J2ME currently defines two configurations. In this article
we look at the first of these, the Connected Limited Device Configuration, or CLDC for short.
The CLDC Specification
Like all J2ME technology, the CLDC is defined by a specification that has passed through the Java Community
Process (JCP). At this time, there are two versions of the CLDC. Version 1.0, released in May of 2000, is known
as Java Specification Request (JSR) 30. Version 1.1, currently in public review, is JSR 139. Because version 1.0
is the one that is currently shipping in devices, we'll concentrate on it.
The CLDC specification defines three things:
1. The capabilities of the Java virtual machine (VM), which is not a full-featured Java VM.
2. A very small subset of the J2SE 1.3 classes.
3. A new set of APIs (application programming interfaces) for input/output called the Generic Connection
Framework.
It's also important to understand what the CLDC does not define. The CLDC does not define any APIs related to
user interfaces. The CLDC does not define how applications are loaded onto a device or how they are activated
or deactivated. These and other things are defined by the J2ME profiles that use the CLDC as their base. So
while it's true that the CLDC does define a complete Java runtime environment, the additional APIs defined by a
profile or supplied by the vendor are really necessary to build useful applications.
The Virtual Machine
The Java VM used in the CLDC is restricted in certain important ways when compared to a full-featured J2SE
VM. These restrictions allow the VM to fit the memory and power constraints of the small devices that the
CLDC target: the CLDC VM and classes can fit in 128K of memory.
The primary restrictions on the VM are:
* No floating point types.
* No object finalization or weak references.
* No JNI or reflection (hence no object serialization).
* No thread groups or daemon threads (note that threads are supported, just not thread groups).
* No application-defined class loaders.
Note that CLDC 1.1 relaxes some of these restrictions, in particular reenabling support for floating point types
and weak references.
In addition to the above restrictions, the CLDC also requires class verification to be done differently. Class files
are processed by an off-device class verifier, a process called preverification. At runtime, the VM uses
information inserted into the class files by the preverifier to perform the final verification steps. Files that have
not been processed by the preverifier are not loaded since they cannot be verified.
The J2SE Subset
The subset of J2SE 1.3 included in the CLDC consists of classes from these three packages:
* java.lang
* java.io
* java.util
Only selected classes from each package are included: for example, the java.util.Vector and java.util.Hashtable
classes are included, but none of the collection classes are. The largest package is the java.lang package, which
defines the classes that are fundamental to any java application, classes like java.lang.Object or java.lang.Integer.
The java.io subset only includes abstract and memory-based classes and interfaces like java.io.DataInput or
java.io.ByteArrayInputStream. The java.util subset only includes a few utility classes.
Some of the classes are subsets of their J2SE equivalents. Configurations are allowed to remove unnecessary
methods or fields, but they cannot add new public or protected methods or fields.
The Generic Connection Framework
J2SE includes many classes for performing input and output, classes that are found in the java.io and the java.net
packages. Unfortunately, there are a large number of I/O classes and they tend to encapsulate I/O models that are
not necessarily found on all devices. For example, some handheld devices do not have file systems. Socket
support is not universal, either.
What the CLDC has done, then, is to define a new set of APIs for I/O called the Generic Connection Framework.
The GFC, part of the new javax.microedition.io package, defines interfaces for the different kinds of I/O that are
possible and a factory class for creating objects that implement those interfaces. The type of object to create is
specified in the protocol part of the URL (universal resource locator) passed to the factory class.
For example, a socket connection can be made using code like this:
import java.io.*;
import javax.microedition.io.*;
StreamConnection conn = null;
InputStream is = null;
String url = "socket://somewhere.com:8909";
try {
conn = (StreamConnection) Connector.open( url );
is = conn.openInputStream();
.... // etc. etc.
}
catch( ConnectionNotFoundException cnfe ){
// handle it
}
catch( IOException e ){
// handle it
}
finally {
if( is != null ) try { is.close(); } catch( Exception e ){}
if( conn != null ) try { conn.close(); } catch( Exception e ){}
}
The code above assumes that the device knows how to map the "socket" protocol in the URL to an object that
implements the GCF's StreamConnection interface, which defines methods for obtaining the input and output
streams of a socket connection. It should be noted, however, that the CLDC does not actually define any I/O
implementations. In other words, the CLDC defines the interfaces of the GCF, but the implementation classes -the ones that do the actual I/O -- are left to the profiles and/or the device vendor to define. For example, the
Mobile Information Device Profile (MIDP) -- a CLDC-based profile -- requires support for a subset of HTTP 1.1
and so it recognizes the "http" protocol in URLs and returns objects that implement the GCF's
ContentConnection interface.
Using the CLDC
By itself, the CLDC is a limited programming platform. Because it does not define any user interface classes or
implement any I/O models, about all you can do for output is write to the System.out stream, which may or may
not be captured to a console or file. You really need the extra classes defined by a J2ME profile (like those of the
MIDP) or device-specific classes (like those on the RIM BlackBerry devices or certain Japanese i-Mode phones)
to do anything interactive.
If you're still interested in trying out the CLDC, Sun has a reference implementation hosted on Windows or
Solaris available for download from its website. This reference implementation includes the preverify offline
verification utility as well as a CLDC VM and the CLDC runtime classes. See Sun's main CLDC page for links
to it and to the CLDC specification. You can also use toolkits or integrated development environments like Sun's
J2ME Wireless Toolkit, Metrowerks' CodeWarrior Wireless Studio, or Borland's JBuilder MobileSet to explore
CLDC programming.
Understanding The Connected Device Configuration (CDC)
The second configuration at the core of Java 2 Micro Edition (J2ME) is the Connected Device Configuration, or
CDC for short.The CDC is a superset of the Connected Limited Device Configuration (CLDC). It provides a
much more conventional Java 2 runtime environment.
The CDC Specification
Like the CLDC (see my previous article, The Connected Limited Device Configuration (CLDC)), the CDC is
defined by a specification that has passed through the Java Community Process (JCP). The CDC, known as Java
Specification Request (JSR) 36, was released in March 2002.
The CDC specification is a much smaller document than the CLDC specification because the CDC is much
closer to a Java 2 Standard Edition (J2SE) runtime environment than the CLDC. The CDC specification defines
four things in particular:
1. The capabilities of the Java virtual machine (VM). Unlike the CLDC, the CDC VM is a full-featured VM.
2. A subset, much larger than the CLDC's, of the J2SE 1.3 classes.
3. The same APIs (application programming interfaces) that are new to the CLDC -- in other words, the
Generic Connection Framework (GCF).
4. Support for file- and datagram-based input/output using both the GCF and the familiar java.io and java.net
classes.
Note that, just like the CLDC, the CDC does not define any user interface classes or how applications are loaded
and activated: these are left for the profiles to define.
The Virtual Machine
The CDC supports a complete, full-featured Java 2 virtual machine (VM) as defined in The Java Virtual
Machine Specification. The low-level interfaces for calling native code, connecting to debuggers, and profiling
code are optional, but if supported they must be the standard interfaces -- Java Native Interface (JNI), Java
Virtual Machine Debugging Interface (JVMDI), and Java Virtual Machine Profiling Interface (JMVPI) -- used in
Java 1.3.
Note that the CDC does not require preverification of classes, as full class verification is done on the device by
the VM. Classes that have been preverified can also be used, of course, since the additional information added to
the class files by the preverifier is ignored.
Because the VM is full-featured, and there are more classes, the minimum memory footprint for the CDC is
larger than the CLDC's: the device needs at least 512K for the runtime environment, plus at least 256K to hold
and run applications.
The J2SE Subset
The subset of J2SE 1.3 included in the CDC consists of classes from these packages:
* java.io
* java.lang
* java.lang.ref
* java.lang.math
* java.net
* java.security
* java.security.cert
* java.text
* java.util
* java.util.jar
* java.util.zip
As you can see, the CDC includes many more packages than the CLDC, and many more classes even in the
shared packages. For example, the CDC includes the collections classes from the java.util package, while the
CLDC does not. This makes the CDC a much more J2SE-like environment than the CLDC. There are still
classes missing, of course. For example, the java.net package as defined by the CDC only includes the classes
related to datagram sockets, not stream sockets.
The Generic Connection Framework
Since the CDC is a superset of the CLDC, it includes the Generic Connection Framework (GCF). Unlike the
CLDC, however, the CDC also requires GCF support for two specific connection types: files and datagrams.
This makes sense because the CDC includes the file classes from the java.io package and the datagram classes
from the java.net package. It is therefore straightforward for the device manufacturer to write GCF
implementation classes that simply map GCF requests (using the file or datagram protocol at the start of a URL)
into their java.io and java.net equivalents.
File and Datagram Support
Here is an example of opening a file for writing using the GCF:
import java.io.*;
import javax.microedition.io.*;
try {
String url = "file:/logs/mylog.txt";
OutputConnection conn =
(OutputConnection) Connector.open( url,
Connector.WRITE );
OutputStream out = conn.openOutputStream();
..... // write to the output stream
out.close();
conn.close();
}
catch( IOException e ){
// handle error
}
Datagram support is a bit more complex, but quite similar.
Why not just use the java.io and java.net classes directly? The GCF provides a consistent I/O model that works
across all J2ME platforms that support the required protocols. If you don't need interoperability with J2SE, use
the GCF whenever possible to open your I/O connections.
Using the CDC
Like the CLDC, the CDC is by itself a limited programming platform. Again, because it does not define any user
interface classes or implement any I/O models, about all you can do for output is write to the System.out stream,
which may or may not be captured to a console or file. The extra classes defined by one or more J2ME profiles
are really required to write interactive applications.
Sun has a reference implementation of the CDC hosted on Linux available for download from its website. See
Sun's main CDC page for links to it and to the CDC specification.
The Importance of the Mobile Information Device Profile (MIDP)
By Eric Giguère
Although configurations are at the heart of Java 2 Micro Edition (J2ME), it's the profiles that are of real interest.
Profiles define the application programming interfaces (APIs) that are required to write useful applications for a
particular group or family of J2ME devices. The Mobile Information Device Profile (MIDP) defines a Java
runtime environment for cellphones, interactive pagers, and similar mass-produced, resource-constrained
handheld devices.
Mobile Information Devices
MIDP is targeted at a class of devices known as mobile information devices (MIDs). These are devices that have
the following minimal characteristics:
* Enough memory to run MIDP applications (see below)
* A bit addressable display at least 96 pixels wide by 56 pixels high, either monochrome or color.
* A keypad, keyboard, or touch screen.
* Two-way wireless networking capability.
Almost any wireless device built these days fits the definition of a MID, including low-end cellphones. Personal
digital assistants (PDAs) can also be considered to be MIDs because wireless networking is now an option for
most PDAs, but MIDP doesn't target these devices specifically: PDAs have more memory, larger screens, and
interesting information management capabilities that are more effectively exploited using other profiles.
The MIDP Specification
There are two versions of the Mobile Information Device Profile, both defined using the Java Community
Process (JCP). MIDP 1.0, known as Java Specification Request (JSR) 37, was released in September 2000.
MIDP 2.0, JSR 118, is currently in proposed final draft form, the final step before formal release as a final
specification. No devices yet support MIDP 2.0, but there are many devices currently on the market that support
MIDP 1.0. We'll concentrate solely on MIDP 1.0 for now, deferring discussion of MIDP 2.0 until later in this
series.
The MIDP 1.0 specification was defined by an expert group consisting of all the major players in the wireless
and handheld device arena, including familiar names like Motorola, Nokia, Ericsson, Research in Motion, and
Symbian. It has a lot of support in the telecommunications industry, and handset manufacturers like Motorola
and Nokia in particular are devoting a lot of development effort to supporting MIDP in a wide range of their
devices.
The configuration used by MIDP is the Connected Limited Device Configuration (CLDC), which we've already
discussed in a previous article in this series. The CLDC has the small footprint required to run on low-end
devices. Devices that are capable of running the other configuration, the Connected Device Configuration
(CDC), can also run MIDP, of course, since the CDC is a superset of the CLDC.
The MIDP adds APIs in a number of areas to the very basic APIs defined by the CLDC. The new features
include:
* Support for application lifecycle management similar to the way applets are defined in Java 2 Standard
Edition.
* Persistent storage of data.
* HTTP-based network connectivity based on the CLDC's Generic Connection Framework.
* Simple user interface support, with enough flexibility to build games or business applications.
The MIDP specification is silent about a number of things, however. For example, in MIDP 1.0 there is no
standard way to interface to the device's phonebook, if it has one, in order to initiate voice calls. There are no
standard facilities for data synchronization, even if the device supports the feature. Device manufacturers can
and do provide their own device-specific APIs for these kinds of features, though, but using them limits your
application's portability.
Note that the MIDP specification is particularly silent in one area: how MIDP applications are loaded onto a
device and how they are activated or deactivated. As such, different devices will do these in different ways. The
MIDP specification basically concerns itself with what the application does once it's running, not how it's
activated.
MIDlets and MIDlet Suites
As mentioned, MIDP defines an application lifecycle model similar to the applet model. In fact, MIDP does not
support the running of traditional applications that use a static main method as their entry point. Nor can MIDP
applications call the System.exit method in order to terminate. MIDP applications must follow specific
packaging rules.
A MIDP application is referred to as a MIDlet. Its entry point is a class that extends the
javax.microedition.midlet.MIDlet class, much in the same way that an applet extends the java.applet.Applet
class. This class is referred to as the MIDlet's main class. The MIDlet class defines abstract methods that the
main class implements: these methods are called by the system to notify the MIDlet that its state is changing. For
example, whenever the MIDlet is being activated its startApp method is called. Again, this is very similar to the
way applets behave.
Here is the code for a very basic MIDlet, drawn from Chapter 3 of Mobile Information Device Profile for Java 2
Micro Edition:
// A trivial MIDlet
package com.developer.j2me;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class MyMIDlet extends MIDlet
implements CommandListener {
private Display display;
private Command exitCommand = new Command( "Exit",
Command.EXIT, 1 );
// Constructor, doesn't do anything really
public MyMIDlet(){
System.out.println( "MyMIDlet constructed" );
}
// Called when the system is destroying the MIDlet.
protected void destroyApp( boolean unconditional )
throws MIDletStateChangeException {
exitMIDlet();
}
// Called when the system is pausing the MIDlet.
protected void pauseApp(){
System.out.println( "MyMIDlet paused" );
}
// Called when the system is activating the MIDlet.
protected void startApp() throws MIDletStateChangeException {
if( display == null ){ // first time called...
initMIDlet();
}
System.out.println( "MyMIDlet started" );
}
// Called to initialize the MIDlet. Executes only
// once. Obtains the Display instance associated
// with this MIDlet and creates a simple
// user interface for it.
private void initMIDlet(){
display = Display.getDisplay( this );
display.setCurrent( new TrivialForm() );
}
// Called to exit the MIDlet. Centralizes all the
// cleanup work.
public void exitMIDlet(){
notifyDestroyed();
System.out.println( "MyMIDlet destroyed" );
}
// Event handling. Called by the system when the
// user activates a command, normally by pressing
// a button.
public void commandAction( Command c, Displayable d ){
exitMIDlet();
}
// A trivial UI screen. A titled blank screen
// to which a single command is associated. The system
// will map that command to a button or a menu item.
class TrivialForm extends Form {
TrivialForm(){
super( "MyMIDlet" );
addCommand( exitCommand );
setCommandListener( MyMIDlet.this );
}
}
}
One or more MIDlets are packaged together into what is referred to as a MIDlet suite, which is basically a
standard JAR (Java archive) file and a separate file called an application descriptor. All the user-defined classes
required by the suite's MIDlets must be in the JAR file, along with any other resources (such as images) that the
MIDlets require. The JAR file must also include a manifest with a number of MIDP-specific entries that describe
the MIDlets in the suite. The application descriptor contains similar information, and is used by devices to obtain
information about a MIDlet suite without having to download and install the MIDlet suite first.
Here is an example of the manifest that goes along with the simple MIDlet shown above:
MIDlet-1: MyMIDlet, MyMIDlet.png, com.developer.j2me.MyMIDlet
MIDlet-Name: MyMIDlet
MIDlet-Vendor: Eric Giguere
MIDlet-Version: 1.0
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0
And here is an example of an application descriptor for the same MIDlet:
MIDlet-1: MyMIDlet, MyMIDlet.png, com.developer.j2me.MyMIDlet
MIDlet-Jar-Size: 4238
MIDlet-Jar-URL: http://somewhere.foo.com/MyMIDlet.jar
MIDlet-Name: MyMIDlet
MIDlet-Vendor: Eric Giguere
MIDlet-Version: 1.0
These are only examples, of course, and we'll be discussing these in more detail as the series progresses.
Developing MIDP Applications
As the first J2ME profile to be released and to ship commercially, there are actually several MIDP programming
tools available, often as add-ins for your favorite Java development environment. A development environment is
not enough, however.
The reality of MIDP programming today is that the applications you can write are constrained in many ways.
These constraints often require you to think about things that you wouldn't think of twice of with J2SE
programming. Memory is a particularly scarce resource, for example. The early Motorola J2ME-enabled phones
limited the size of a MIDlet suite to 50K (since raised to 100K on more recent models) and some Nokia phones
limit them to even less, about 30K. Because MIDP 1.0 applications cannot share classes between suites, this
really limits what you can do on the device. You'll find that placing part of your application in a web or
application server (as a servlet, typically) that the MIDP application calls is almost a requirement for anything
serious. This will change over time, of course, as memory limits are eased in newer devices.
Eric Giguère is the author of Java 2 Micro Edition, the first book about J2ME, and co-author of Mobile
Information Device Profile for Java 2 Micro Edition, both published by John Wiley & Sons. He works as a
software developer for iAnywhere Solutions, a subsidiary of Sybase. For more information about Eric, see his
web site or drop him a note at ericgiguere@ericgiguere.com.
Download