TweetFollow Us on Twitter

Writing Java Cross-Platform

Volume Number: 14 (1998)
Issue Number: 5
Column Tag: Javatech

Writing Java on the Mac for All Platforms

by Ken Ryall

Here are several of the pitfalls of writing multi-platform Java code

It's easier than ever to write your Java code on the Mac for multi-platform use. You can write once on the Mac, then run anywhere, but you'll learn a lot about the way Java is implemented on each platform along the way.

Ironically, the Mac is a good Pure Java starting point. If it works on the Mac it should work on other Java platforms. However, there are differences, often subtle ones. These differences between Java on the Mac and Java on other platforms are often reflections of each underlying operating system. In addition to differences in how each virtual machine is implemented, other potential problem areas include threads, networking, file systems, and user interface elements.

Java Threads

Unlike most other Java platforms, Macintosh Java uses cooperative threads rather than preemptive ones. Java's preemptive threads are simulated on the Mac by a cooperative VM. It will yield time to other Java threads and to the Mac OS when a Java thread's state becomes "not runnable". This happens when a thread is waiting for I/O to complete, is put to sleep, is suspended and in a few other cases.

This difference in underlying thread implementation means you should avoid making assumptions about thread scheduling, priority or timing beyond what is specified in the Java API. Threads of equal priority will get very different treatment depending on the VM.

Also, be aware of what kind of code will let the VM run other threads. For example, when opening a socket and listening for connection requests, the VM will run other threads while waiting for Socket.accept() to return a connected socket.

// bind a socket on port 3000
ServerSocket mySocket = new ServerSocket(3000);
// listen for connection requests
Socket clientSocket = mySocket.accept();

However, the loop below contains no calls to I/O and may block other threads on the Mac. On platforms such as Windows NT other threads would still be allowed to run.

int count = 5000000; // busy pointless loop
while (count > 0)
   count -; // While in loop VM may run other threads, maybe not.

If you have CPU intensive loops like this you'll need to call Thread.yield() to allow the VM to service other threads.

If your application uses threads in more than a casual way you'll need to experiment to find best cross-platform performance. For example, here is a thread with an idle loop that checks things now and again and shares time with other threads by calling Thread.yield():

public void run()
{
   boolean keepGoing = true;
   while(keepGoing)
   {
      // do some stuff...
      // yield time to other threads
      yield();
   }
}

Calling Thread.yield() while looping seems to work fine on the Mac. However, on Windows NT constantly calling Thread.yield() will leave the VM hogging as much of the CPU time as it can get. Putting the thread to sleep for short periods is a better cross platform solution.

public void run()
{
   boolean keepGoing = true;
   while(keepGoing)
   {
      // do some stuff...
      // sleep for ten seconds, this will let other threads run
      sleep(1000 * 10);
   }
}

Developing on the Mac will also make you keep your use of threads simple: more than a few running Java threads hurts performance more than on other platforms.

Networking

The network classes in the java.net package use whatever native TCP/IP services the host machine offers. This means your Java networking code will pick up any eccentricities in the native libraries. A common complaint of cross platform Java developers is that their network sockets work with one platform/VM combination but not another. Results can even vary from machine to machine and network to network.

Networking problems can include socket/stream combinations that don't return all the data until asked multiple times. Other sockets don't seem to want to send their data until closed, even after being flushed.

In one case, my server was returning some data by writing to a stream and closing the socket. This worked fine on Mac OS and Windows NT but sent empty packets from some Windows 95 machines on some networks. The fix? Insert a tiny delay between flushing the stream and closing the socket. How did I find it? Desperate trial and error.

Most of these problems are related to bugs in the various VMs, whose intensive revision has produced evolving levels of functionality and stability. Reviewing some of the many Java networking examples can help identify problems and workarounds. In particular, the web server Jigsaw http://www.w3.org/jigsaw/ is a good example of a complex multi-threaded application. Jigsaw works cross-platform and has undergone more extensive testing than most examples available.

Unix Subtleties

Java includes cross-platform classes for handling files and tries to present a platform neutral API, but it helps to remember that the whole thing came from the Unix world. Nowhere is this more apparent than in the way the File class works. In fact, the Java File class probably creates more cross-platform problems than any other because of its assumptions about the native file system.

To begin with, file names can be longer than the 31 characters that the current Mac file system allows. ( HFS+ supports longer file names internally, but there isn't an API to access them yet.) Lots of Java sample code that has never seen a Mac has files like: "MyReallyCoolJavaThreadedNetworkingClass.java". VMs on the Mac have no problem with longer names in JAR files, you just can't have the original source files. This can be a problem if you're working with developers on other platforms who like very long file names. Until the long filenames in HFS+ are accessible, you'll either have to get them to be less verbose, or build their work into libraries so you won't have to work with their source files directly.

Various VMs also make different assumptions about case-sensitivity of file names and allowable characters in file names. Remember that most virtual machines began life as Unix source code and may be incompletely ported to their new native file systems.

In Java, files are specified by path name, but trying to build a path name in a platform neutral fashion is difficult because VMs return inconsistent and conflicting values for descriptions of parent directories and separator characters. Making a path name that will work with one VM isn't too difficult, making one that is cross platform friendly is often much more difficult.

Cross platform Java developers are frustrated by this and usually try to simplify file specification so they don't have to build path names. If you do, be sure to use File.pathSeparator() instead of hard coding a path separator. Also, examine your file naming schemes and remove characters that aren't allowed on any of your target platforms.

User Interface

Differences in platform user interface mean that a some of your interface may not come out looking like you intended. Fortunately you can often tweek placements, sizes etc. in a platform neutral way, you'll just need to try out the results on each of your target platforms as you go. Be sure to use layout managers, not absolute locations, to place items and avoid assumptions about things like font metrics and screen size.

Also, every VM on every platform has its own AWT bugs and display glitches, and these change as the VMs are revised. Most of these you'll be able to see and work around.

Don't forget that while you can write a lot of pure java cross platform code, you can still determine what platform is running your Java code and act accordingly.

      String whichOS = System.getProperty("os.name");
      if (whichOS.contains("Mac"))
      {
         // do mac specific stuff here
      }

Testing

Testing cross-platform Java applications is simple if tedious; you just have to try it with every VM/platform combination you hope to use it with. In particular, exercise the features that use networking, threads, and deal with files. Check the UI carefully for missing elements and overlapping items.

Some of the Java tools are less mature than their C++ equivalents so there aren't as many debuggers and other testing utilities to work with. Of course, there is the old fashioned way: System.out.println(). Finding out how things work with virtual machine X on platform Y is mostly a matter of trial and error.

It's also helpful to find other developers who are sharing their experiences with the VMs you are targeting. For Mac VMs a good place to start is the MRJ mailing list at http://www.lists.apple.com/mrj.html and there is also the Metrowerks newsgroup at news://news.metrowerks.com/comp.sys.mac.programmer.codewarrior.

Installing

Java's platform independence quickly vanishes when its time to install and launch your application. Each platform has its own VM installation and method for launching a Java application. If you want to look just like any other professional application you'll need to build an installer for each platform that includes a VM and puts all your pieces where you want them: maybe the "Startup Items" folder on the Mac or as a service on NT.

This can be complex and tough to maintain, but is no worse than installing a complex cross platform C++ application. A more Java-oriented solution is InstallAnywhere, available from Zero G Software http://www.zerog.com. InstallAnywhere is written in Java and lets you build an single universal installer that will work on any platform, including setting the runtime environment, and installing a VM.

Write Once...

Developing cross platform Java code on the Mac really works if you'll keep a few things in mind. You can write once and run anywhere as long as you test and make a few adjustments. Finding solutions to cross-platform problems will often reveal problem code that slipped by the original complier or VM and needs to be reworked anyway. If you'll willing to deal with a few platform-specific problems and a wider variety of VM behavior, you'll have the satisfaction of developing your code on the Mac, and the ability to drop the result on an NT machine and find that it all just works.


Ken Ryall, kryall@outer.net, has been developing on the Mac since 1985 and is currently working on the debugger at Metrowerks in Austin, TX. When not at work he's usually out flying or at home trying to convince his border terrier not to chew up the ISDN line again.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

MacFamilyTree 8.2.5 - Create and explore...
MacFamilyTree gives genealogy a facelift: modern, interactive, convenient and fast. Explore your family tree and your family history in a way generations of chroniclers before you would have loved.... Read more
Hopper Disassembler 4.3.2- - Binary disa...
Hopper Disassembler is a binary disassembler, decompiler, and debugger for 32- and 64-bit executables. It will let you disassemble any binary you want, and provide you all the information about its... Read more
GraphicConverter 10.5.1 - $39.95
GraphicConverter is an all-purpose image-editing program that can import 200 different graphic-based formats, edit the image, and export it to any of 80 available file formats. The high-end editing... Read more
Delicious Library 3.7 - Import, browse a...
Delicious Library allows you to import, browse, and share all your books, movies, music, and video games with Delicious Library. Run your very own library from your home or office using our... Read more
Adobe Animate CC 2017 18.0.0.107 - Anima...
Animate CC 2018 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Flash Professional customer). Animate CC 2018 (was Flash CC) lets you... Read more
Adobe After Effects CC 2018 15.0 - Creat...
After Effects CC 2018 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous After Effects customer). The new, more connected After Effects CC... Read more
Adobe Premiere Pro CC 2018 12.0.0 - Digi...
Premiere Pro CC 2018 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Premiere Pro customer). Adobe Premiere Pro CC 2018 lets you edit... Read more
Alarm Clock Pro 10.3 - $19.95
Alarm Clock Pro isn't just an ordinary alarm clock. Use it to wake you up in the morning, send and compose e-mails, remind you of appointments, randomize the iTunes selection, control an internet... Read more
Adobe Lightroom 20170919-1412-ccb76bd] -...
Adobe Lightroom is available as part of Adobe Creative Cloud for as little as $9.99/month bundled with Photoshop CC as part of the photography package. Lightroom 6 is also available for purchase as a... Read more
Adobe Illustrator CC 2018 22.0.0 - Profe...
Illustrator CC 2018 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Illustrator customer). Adobe Illustrator CC 2018 is the industry... Read more

ICEY (Games)
ICEY 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: ICEY is a 2D side-scrolling action game. As you follow the narrator's omnipresent voice, you will see through ICEY's eyes and learn the... | Read more »
The best new games we played this week -...
We've made it, folks. Another weekend is upon us. It's time to sit back and relax with the best new releases of the week. Puzzles, strategy RPGs, and arcade games abound this week. There's a lot of quality stuff to unpack this week, so let's hop... | Read more »
Wheels of Aurelia (Games)
Wheels of Aurelia 1.0.1 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0.1 (iTunes) Description: | Read more »
Halcyon 6: Starbase Commander guide - ti...
Halcyon 6 is a well-loved indie RPG with stellar tactical combat and some pretty good writing, too. It's now landed on the App Store, so mobile fans, if you're itching for a good intergalactic adventure, here's your game. Being a strategy RPG, the... | Read more »
Game of Thrones: Conquest guide - how to...
Fans of base building games might be excited to know that yet another entry in the genre has materialized - Game of Thrones: Conquest. Yes, you can now join the many kingdoms of the famed book series, or create your own, as you try to conquer... | Read more »
Halcyon 6: Starbase Commander (Games)
Halcyon 6: Starbase Commander 1.4.2.0 Device: iOS Universal Category: Games Price: $6.99, Version: 1.4.2.0 (iTunes) Description: An epic space strategy RPG with base building, deep tactical combat, crew management, alien diplomacy,... | Read more »
Legacy of Discord celebrates its 1 year...
It’s been a thrilling first year for fans of Legacy of Discord, the stunning PvP dungeon-crawling ARPG from YOOZOO Games, and now it’s time to celebrate the game’s first anniversary. The developers are amping up the festivities with some exciting... | Read more »
3 reasons to play Thunder Armada - the n...
The bygone days of the Battleship board game might have past, but naval combat simulators still find an audience on mobile. Thunder Armada is Chinese developer Chyogames latest entry into the genre, drawing inspiration from the explosive exchanges... | Read more »
Experience a full 3D fantasy MMORPG, as...
Those hoping to sink their teeth into a meaty hack and slash RPG that encourages you to fight with others might want to check out EZFun’s new Eternity Guardians. Available to download for iOS and Android, Eternity Guardians is an MMORPG that lets... | Read more »
Warhammer Quest 2 (Games)
Warhammer Quest 2 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Dungeon adventures in the Warhammer World are back! | Read more »

Price Scanner via MacPrices.net

Save $100 on 13″ MacBook Airs, prices start a...
Adorama has 2017 13″ MacBook Airs on sale today for $100 off MSRP including free shipping. Adorama charges NY & NJ sales tax only: – 13″ 1.8GHz/128GB MacBook Air (MQD32LL/A): $899, $100 off MSRP... Read more
1.4GHz Mac mini available for $399, $100 off...
TigerDirect has the 1.4GHz Mac mini on sale today for $399 including free shipping. Their price is $100 off MSRP, and it’s the lowest price available for this model. Although currently out of stock,... Read more
21″ 2.3GHz iMac on sale for $999, save $100
MacMall has the 21″ 2.3GHz iMac (MMQA2LL/A) on sale today for $999 including free shipping. Their price is $100 off MSRP, and it’s the lowest price available for this model. Read more
12″ iPad Pros on sale for $50 off MSRP, no ta...
Adorama has 12″ iPad Pros on sale today for $50 off MSRP. Shipping is free, and Adorama charges sales tax in NY & NJ only: – 12″ 64GB iPad Pro: $749, save $50 – 12″ 256GB iPad Pro: $899, save $50... Read more
9″ iPads on sale for $30 off, starting at $29...
MacMall has 9″ iPads on sale for $30 off including free shipping: – 9″ 32GB iPad: $299 – 9″ 128GB iPad: $399 Read more
Apple restocks full line of refurbished 13″ M...
Apple has restocked a full line of Apple Certified Refurbished 2017 13″ MacBook Pros for $200-$300 off MSRP. A standard Apple one-year warranty is included with each MacBook, and shipping is free.... Read more
13″ 3.1GHz/256GB MacBook Pro on sale for $167...
Amazon has the 2017 13″ 3.1GHz/256GB Space Gray MacBook Pro on sale today for $121 off MSRP including free shipping: – 13″ 3.1GHz/256GB Space Gray MacBook Pro (MPXV2LL/A): $1678 $121 off MSRP Keep an... Read more
13″ MacBook Pros on sale for up to $120 off M...
B&H Photo has 2017 13″ MacBook Pros in stock today and on sale for up to $120 off MSRP, each including free shipping plus NY & NJ sales tax only: – 13-inch 2.3GHz/128GB Space Gray MacBook... Read more
15″ MacBook Pros on sale for up to $200 off M...
B&H Photo has 15″ MacBook Pros on sale for up to $200 off MSRP. Shipping is free, and B&H charges sales tax in NY & NJ only: – 15″ 2.8GHz MacBook Pro Space Gray (MPTR2LL/A): $2249, $150... Read more
Roundup of Apple Certified Refurbished iMacs,...
Apple has a full line of Certified Refurbished 2017 21″ and 27″ iMacs available starting at $1019 and ranging up to $350 off original MSRP. Apple’s one-year warranty is standard, and shipping is free... Read more

Jobs Board

Project Engineer, *Apple* Education Profess...
Project Engineer, Apple Education Professional Services Job Number: 113143353New York City, New York, United StatesPosted: Oct. 17, 2017Weekly Hours: 40.00 Job Read more
Commerce Software Engineer, *Apple* Media P...
Commerce Software Engineer, Apple Media Products Job Number: 113092072New York City, New York, United StatesPosted: Oct. 19, 2017Weekly Hours: 40.00 Job Summary With Read more
Engineering Manager, *Apple* Retail Enginee...
# Engineering Manager, Apple Retail Engineering Job Number: 58139948 Santa Clara Valley, California, United States Posted: 20-Oct-2017 Weekly Hours: 40.00 **Job Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Commerce Engineer, *Apple* Media Products -...
Commerce Engineer, Apple Media Products (New York City) Job Number: 113028813New York City, New York, United StatesPosted: Sep. 20, 2017Weekly Hours: 40.00 Job Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.