Tuesday, November 18, 2014

Cross-Compilation Example


Cross-Compilation Example

The following example uses javac to compile code that will run on a 1.6 VM.
$ javac -source 1.6 -target 1.6
-bootclasspath /usr/local/java/jdk1.6.0_32/jre/lib/rt.jar -extdirs ""
*.java

The -source 1.6 option specifies that version 1.6 (or 6) of the Java programming language be used to compile OldCode.java. The option -target 1.6 option ensures that the generated class files will be compatible with 1.6 VMs. Note that in most cases, the value of the -target option is the value of the -source option; in this example, you can omit the -target option.
You must specify the -bootclasspath option to specify the correct version of the bootstrap classes (the rt.jar library). If not, the compiler generates a warning:
$ javac -source 1.6 *.java
warning: [options]
bootstrap class path not set in conjunction with -source 1.6
If you do not specify the correct version of bootstrap classes, the compiler will use the old language rules (in this example, it will use version 1.6 of the Java programming language) combined with the new bootstrap classes, which can result in class files that do not work on the older platform (in this case, Java SE 6) because reference to non-existent methods can get included.

Exception in thread "main" java.lang.UnsupportedClassVersionError: AdapterTest : Unsupported major.minor version 51.0


Exception in thread "main" java.lang.UnsupportedClassVersionError: AdapterTest : Unsupported major.minor version 51.0

Description and Solving:
First check the javac and java version:

rizvi@rizvi-pc:~/Desktop/Adapter$ javac -version
javac 1.7.0_65
rizvi@rizvi-pc:~/Desktop/Adapter$ java -version
java version "1.6.0_32"
Java(TM) SE Runtime Environment (build 1.6.0_32-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.7-b02, mixed mode)
rizvi@rizvi-pc:~/Desktop/Adapter$

So, a higher JDK version  is used to compile the source file and  a lower JDK version is used to run the program.
But its important to note is that vice-versa is not true "you can compile your program in J2SE 1.4 and run on J2SE 1.5 and you will not get any UnSupportedClassVersionError". When a higher JDK is used for compilation it creates class file with higher version and when a lower JDK is used to run the program it found that higher version of class file not supported at JVM level and results in java.lang.UnsupportedClassVersionError.

First solution:

The version number "major.minor version 51.0" show which Java was used to run eclipse.
51.0
= Java J2SE 7
To fix your problem you should try to run eclise with Java 7. This can be done by updating your Java configuration:
sudo update-alternatives --config java
Then select a Java 7 version and retry.
If Java 7 isn't installed you can get it with apt-get:
sudo apt-get install default-jdk

------------------------------------------------------------------------------

Second Solution:

http://crunchify.com/exception-in-thread-main-java-lang-unsupportedclassversionerror-comcrunchifymain-unsupported-major-minor-version-51-0/

------------------------------------------------------------------------------

Third Solution: 

Java Cross-compilation:
rizvi@rizvi-pc:~/Desktop/Adapter$ javac -target 1.6 -source 1.6 -bootclasspath /usr/local/java/jdk1.6.0_32/jre/lib/rt.jar *.java

Here,
target and source must be same.
rizvi@rizvi-pc:~/Desktop/Adapter$ java AdapterTest;
Area
= 100
rizvi@rizvi-pc:~/Desktop/Adapter$