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

Lyn 1.7.2 - Lightweight image browser an...
Lyn is a fast, lightweight image browser and viewer designed for photographers, graphic artists, and Web designers. Featuring an extremely versatile and aesthetically pleasing interface, it delivers... Read more
Lyn 1.7.2 - Lightweight image browser an...
Lyn is a fast, lightweight image browser and viewer designed for photographers, graphic artists, and Web designers. Featuring an extremely versatile and aesthetically pleasing interface, it delivers... Read more
Tunnelblick 3.6.7beta02 - GUI for OpenVP...
Tunnelblick is a free, open source graphic user interface for OpenVPN on OS X. It provides easy control of OpenVPN client and/or server connections. It comes as a ready-to-use application with all... Read more
jAlbum Pro 13.4 - Organize your digital...
jAlbum Pro has all the features you love in jAlbum, but comes with a commercial license. You can create gorgeous custom photo galleries for the Web without writing a line of code! Beginner-friendly... Read more
calibre 2.65.1 - Complete e-book library...
Calibre is a complete e-book library manager. Organize your collection, convert your books to multiple formats, and sync with all of your devices. Let Calibre be your multi-tasking digital librarian... Read more
jAlbum 13.4 - Create custom photo galler...
With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code! Beginner-friendly, with pro results - Simply drag and drop photos into groups, choose a design... Read more
Backblaze 4.2.0.966 - Online backup serv...
Backblaze is an online backup service designed from the ground-up for the Mac. With unlimited storage available for $5 per month, as well as a free 15-day trial, peace of mind is within reach with... Read more
Backblaze 4.2.0.966 - Online backup serv...
Backblaze is an online backup service designed from the ground-up for the Mac. With unlimited storage available for $5 per month, as well as a free 15-day trial, peace of mind is within reach with... Read more
Tunnelblick 3.6.7beta02 - GUI for OpenVP...
Tunnelblick is a free, open source graphic user interface for OpenVPN on OS X. It provides easy control of OpenVPN client and/or server connections. It comes as a ready-to-use application with all... Read more
calibre 2.65.1 - Complete e-book library...
Calibre is a complete e-book library manager. Organize your collection, convert your books to multiple formats, and sync with all of your devices. Let Calibre be your multi-tasking digital librarian... Read more

Siralim 2 (RPG / Roguelike) (Games)
Siralim 2 (RPG / Roguelike) 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Siralim 2 is an old-school monster catching RPG. Summon and customize hundreds of creatures to fight for you as... | Read more »
Clean Text (Productivity)
Clean Text 1.0 Device: iOS Universal Category: Productivity Price: $3.99, Version: 1.0 (iTunes) Description: | Read more »
Gemini - A Journey of Two Stars (Games)
Gemini - A Journey of Two Stars 1.0.1 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0.1 (iTunes) Description: *** SPECIAL LAUNCH SALE: $2.99 (25% off) *** "A mesmerizing and unexpectedly emotional journey." -- Los... | Read more »
How to get four NFL superstars for your...
Even though you're probably well on your way to building a top notch squad for the new season in Madden NFL Mobile, let's say you could beef it up by adding Rob Gronkowski, Antonio Brown, Von Miller, and Todd Gurley to your roster. That's... | Read more »
Cartoon Network Superstar Soccer: Goal!!...
Cartoon Network Superstar Soccer: Goal!!! – Multiplayer Sports Game Starring Your Favorite Characters 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Become a soccer superstar with your... | Read more »
NFL Huddle: What's new in Topps NFL...
Can you smell that? It's the scent of pigskin in the air, which either means that cliches be damned, pigs are flying in your neck of the woods, or the new NFL season is right around the corner. [Read more] | Read more »
FarmVille: Tropic Escape tips, tricks, a...
Maybe farming is passé in mobile games now. Ah, but farming -- and doing a lot of a other things too -- in an island paradise might be a little different. At least you can work on your tan and sip some pina coladas while tending to your crops. [... | Read more »
Become the King of Avalon in FunPlus’ la...
King Arthur is dead. Considering the legend dates back to the 5th century, it would be surprising if he wasn’t. But in the context of real-time MMO game King of Avalon: Dragon Warfare, Arthur’s death plunges the kingdom into chaos. Evil sorceress... | Read more »
Nightgate (Games)
Nightgate 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: *** Launch Sale: 25% OFF for a limited time! *** In the year 2398, after a great war, a network of intelligent computers known as... | Read more »
3 best fantasy football apps to get you...
Last season didn't go the way you wanted it to in fantasy football. You were super happy following your drafts or auctions, convinced you had outsmarted everyone. You were all set to hustle on the waiver wire, work out some sweet trades, and make... | Read more »

Price Scanner via MacPrices.net

MacBook Airs on sale for up to $101 off MSRP
Amazon has 11″ and 13″ MacBook Airs on sale for up to $101 off MSRP for a limited time. Shipping is free: - 11″ 1.6GHz/128GB MacBook Air (model MJVM2LL/A): $798 $101 off MSRP - 11″ 1.6GHz/256GB... Read more
Apple certified refurbished iPad mini 4s avai...
Apple has certified refurbished iPad mini 4s now available for up to $120 off the cost of new models. An Apple one-year warranty is included with each iPad, and shipping is free. The following models... Read more
Apple price trackers, updated continuously
Scan our Apple Price Trackers for the latest information on sales, bundles, and availability on systems from Apple’s authorized internet/catalog resellers. We update the trackers continuously: - 15″... Read more
Global Tablet Shipments Projected to Increase...
Digitimes’ Jim Hsiao reports that global tablet shipments will increase by 16.3 percent sequentially to reach nearly 47 million units in 2016′s third quarter, but that volume will still be down over... Read more
Apple’s 2016 Back to School promotion: Free B...
Purchase a new Mac or iPad using Apple’s Education Store and take up to $300 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount. Shipping is free, and... Read more
Apple refurbished iPad Air 2s available start...
Apple has Certified Refurbished iPad Air 2 available starting at $339. Apple’s one-year warranty is included with each model, and shipping is free: - 128GB Wi-Fi iPad Air 2: $499 - 64GB Wi-Fi iPad... Read more
13-inch 2.5GHz MacBook Pro available for $961...
Overstock has the 13″ 2.5GHz MacBook Pro available for $961.63 including free shipping. Their price is $138 off MSRP. Read more
Clearance 12-inch Retina MacBooks, Apple refu...
Apple has Certified Refurbished 2015 12″ Retina MacBooks available starting at $929. Apple will include a standard one-year warranty with each MacBook, and shipping is free. The following... Read more
BookBook Releases SurfacePad, BookBook &...
BookBook has released three new covers just for iPad Pro: SurfacePad, BookBook and BookBook Rutledge Edition. BookBook for iPad Pro is a gorgeous leather case reminiscent of a vintage sketchbook.... Read more
Clean Text 1.0 for iOS Reduces Text Cleanup a...
Apimac today announced availability of Clean Text for iOS, a tool for webmasters, graphic designers, developers and magazine editors to reduce text cleanup and editing time, and also for any iPhone... Read more

Jobs Board

*Apple* Retail - Multiple Positions Victor,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* /Mac Support Engineer - GFI Digital,...
FI Digital, Inc. is currently seeking candidates for a full time Apple Support Engineer to add to our Maryland Heights, Missouri IT team. Candidates must be dynamic Read more
SW Engineer *Apple* TV - Apple Inc. (United...
The Apple TV team is looking for excellent software engineers with experience in hardware, media management, media playback, content delivery and a passion for Read more
Senior *Apple* Administrator - Pratt Instit...
POSITION SUMMARY: Directs the coordination and standardization of campus-wide Apple systems, including planning, analysis and implementation of Apple -related Read more
*Apple* Solutions Consultant - Apple (United...
# Apple Solutions Consultant Job Number: 51218534 Pleasant Hill, California, United States Posted: Aug. 18, 2016 Weekly Hours: 40.00 **Job Summary** As an Apple Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.