GNU Compiler for Java

From Infogalactic: the planetary knowledge core
Jump to: navigation, search
GNU Compiler for Java
Developer(s) The GNU Project
Operating system Unix-like
Type Compiler
License GNU GPL

The GNU Compiler for Java (GCJ) is a free compiler for the Java programming language and a part of the GNU Compiler Collection.[1][2]

GCJ can compile Java source code to Java Virtual Machine bytecode or to machine code for a number of CPU architectures. It can also compile class files and whole JARs that contain bytecode.[3][4]


The GCJ runtime-libraries original source is from GNU Classpath project, but there is a code difference between the libgcj libraries. GCJ 4.3 uses the Eclipse Compiler for Java as a front-end.[5]

In 2007, a lot of work was done to implement support for Java's two graphical APIs in GNU Classpath: AWT and Swing. Software support for AWT is still in development. "Once AWT support is working then Swing support can be considered. There is at least one free-software partial implementations of Swing that may be usable."[6]

As of 2015, there have been no new developments announced from GCJ[7] and the product is currently in deep maintenance mode.[8]


The compilation function in GCJ should have a faster start-up time than the equivalent bytecode launched in a JVM when compiling Java code into machine code.[9]

CNI (Compiled Native Interface)

The CNI (Compiled Native Interface, previously named "Cygnus Native Interface") is a software framework for the GCJ that allows Java code to call, and be called, by native applications (programs specific to a hardware and operating-system platform) and libraries written in C++.

CNI closely resembles the JNI (Java Native Interface) framework which comes as a standard with various Java virtual machines.

Comparison of language use

The authors of CNI claim for various advantages over JNI:[10]

CNI depends on Java classes appearing as C++ classes. For example,[11] given a Java class,

public class Int
   public int i;
   public Int(int i) { this.i = i; }
   public static Int zero = new Int(0);

one can use the class thus:

#include <gcj/cni.h>
#include <Int>

Int *mult(Int *p, int k)
  if (k == 0)
    return Int::zero;  // Static member access.
  return new Int(p->i * k);

See also


External links