Java AWT Native Interface

Java AWT Native Interface

Java AWT Native Interface is an interface for the Java programming language that enables rendering libraries compiled to native code to draw directly to a Java Abstract Window Toolkit (AWT) Javadoc:SE|java/awt|Canvas object drawing surface.

The Java Native Interface (JNI) enabled developers to add platform-dependent functionality to Java applications. The JNI enables developers to add time-critical operations like mathematical calculations and 3D rendering. Previously, native 3D rendering was a problem because the native code didn't have access to the graphic context. The AWT Native Interface is designed to give developers access to an AWT Canvas for direct drawing by native code. In fact, the Java 3D API extension to the standard Java SE JDK relies heavily on the AWT Native Interface to render 3D objects in Java. The AWT Native Interface is very similar to the JNI, and, the steps are, in fact, the same as those of the JNI. See the Java Native Interface article for an explanation of the JNI techniques employed by the AWT Native Interface.

The AWT Native Interface was added to the Java platform with the J2SE 1.3 ("Kestrel") version.

AWT Native Interface example walkthrough

Create the Java application

Type in this in a .java file named JavaSideCanvas and compile: import java.awt.*; import java.awt.event.*; public class JavaSideCanvas extends Canvas { static { System.loadLibrary("NativeSideCanvas"); } public native void paint(Graphics g); public static void main(String [] args) { Frame f = new Frame(); f.setBounds(0, 0, 500, 500); JavaSideCanvas jsc = new JavaSideCanvas(); f.add(jsc); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent ev) { System.exit(0); } }); f.show(); } }See the Java Native Interface article for an explanation of the native keyword and the loadLibrary() method. The paint() method will be simply invoked when the AWT event dispatching thread "repaints" the screen.

Create the C++ header file

Create the C++ header file as usual (See Java Native Interface for more complete explanation.)

The header file looks like this now: /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class JavaSideCanvas */ #ifndef _Included_JavaSideCanvas #define _Included_JavaSideCanvas #ifdef __cplusplus extern "C" { #endif #undef JavaSideCanvas_FOCUS_TRAVERSABLE_UNKNOWN #define JavaSideCanvas_FOCUS_TRAVERSABLE_UNKNOWN 0L #undef JavaSideCanvas_FOCUS_TRAVERSABLE_DEFAULT #define JavaSideCanvas_FOCUS_TRAVERSABLE_DEFAULT 1L #undef JavaSideCanvas_FOCUS_TRAVERSABLE_SET #define JavaSideCanvas_FOCUS_TRAVERSABLE_SET 2L #undef JavaSideCanvas_TOP_ALIGNMENT #define JavaSideCanvas_TOP_ALIGNMENT 0.0f #undef JavaSideCanvas_CENTER_ALIGNMENT #define JavaSideCanvas_CENTER_ALIGNMENT 0.5f #undef JavaSideCanvas_BOTTOM_ALIGNMENT #define JavaSideCanvas_BOTTOM_ALIGNMENT 1.0f #undef JavaSideCanvas_LEFT_ALIGNMENT #define JavaSideCanvas_LEFT_ALIGNMENT 0.0f #undef JavaSideCanvas_RIGHT_ALIGNMENT #define JavaSideCanvas_RIGHT_ALIGNMENT 1.0f #undef JavaSideCanvas_serialVersionUID #define JavaSideCanvas_serialVersionUID -7644114512714619750i64 #undef JavaSideCanvas_serialVersionUID #define JavaSideCanvas_serialVersionUID -2284879212465893870i64 /* * Class: JavaSideCanvas * Method: paint * Signature: (Ljava/awt/Graphics;)V */ JNIEXPORT void JNICALL Java_JavaSideCanvas_paint (JNIEnv *, jobject, jobject); #ifdef __cplusplus } #endif #endif

Implement the C++ native code

Type this in a file named "NativeSideCanvas.cpp" and compile into a library. See Java Native Interface for a more complete explanation.

(Microsoft) Don't forget to link this with "jawt.lib" and "gdi32.lib". These libraries are needed because the code draws a rectangle using routines from these libraries.

Microsoft C++: #include "jawt_md.h" #include #include "JavaSideCanvas.h" JNIEXPORT void JNICALL Java_JavaSideCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics) { JAWT awt; JAWT_DrawingSurface* ds; JAWT_DrawingSurfaceInfo* dsi; JAWT_Win32DrawingSurfaceInfo* dsi_win; jboolean result; jint lock; // Get the AWT awt.version = JAWT_VERSION_1_3; result = JAWT_GetAWT(env, &awt); assert(result != JNI_FALSE); // Get the drawing surface ds = awt.GetDrawingSurface(env, canvas); assert(ds != NULL); // Lock the drawing surface lock = ds->Lock(ds); assert((lock & JAWT_LOCK_ERROR) = 0); // Get the drawing surface info dsi = ds->GetDrawingSurfaceInfo(ds); // Get the platform-specific drawing info dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo; ////////////////////////////// // !!! DO PAINTING HERE !!! // ////////////////////////////// //Simple paints a rectangle (GDI32) Rectangle(dsi_win->hdc, 50, 50, 200, 200); // Free the drawing surface info ds->FreeDrawingSurfaceInfo(dsi); // Unlock the drawing surface ds->Unlock(ds); // Free the drawing surface awt.FreeDrawingSurface(ds); }(For Solaris code and other operating systems see links below.)

Run the example

Run the file as usual. (See Java Native Interface for complete instructions.)

It's interesting to note that the AWT Native Interface requires the "jawt.dll" (or "jawt.so") to run with the application, so the easiest way to do that is copying the "jawt.dll" (should be in the .../jre/bin file path of the JDK's installation path.)

You should see a window with a rectangle drawn in it.

Congratulations! You have made your first AWT Native Application!

Native painting

As you can see, you can paint as if it is a native application. In Windows, the JVM will pass a HWND and other window information to your native application so that your application will "know" where to draw. In this example, it uses GDI to draw a Rectangle. The window information your native side need will be in a JAWT_Win32DrawingSurfaceInfo structure (depending on Operating System) which can be retrieved with this line:

dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;

dsi_win has the information, look in the "jni.h" file for details.

See also

* Java Native Interface
* Abstract Window Toolkit
* Event dispatching thread

External links

* [http://java.sun.com/j2se/1.5.0/docs/guide/awt/1.3/AWT_Native_Interface.html The AWT Native Interface]


Wikimedia Foundation. 2010.

Игры ⚽ Нужно сделать НИР?

Look at other dictionaries:

  • Java Native Interface — JNI redirects here. For the city in the province of Buenos Aires, see Junín, Buenos Aires. The Java Native Interface (JNI) is a programming framework that enables Java code running in a Java Virtual Machine (JVM) to call and to be called[1] by… …   Wikipedia

  • Java Native Interface — Le JNI (Java Native Interface) est un framework qui permet au code Java s exécutant à l intérieur de la JVM d appeler et d être appelé[1] par des applications natives (c est à dire des programmes spécifiques au matériel et au système d… …   Wikipédia en Français

  • Java Platform, Standard Edition — or Java SE is a widely used platform for programming in the Java language. It is the Java Platform used to deploy portable applications for general use.In practical terms, Java SE consists of a virtual machine, which must be used to run Java… …   Wikipedia

  • Java (informatique) — Java (langage) Pour les articles homonymes, voir Java.  Ne doit pas être confondu avec JavaScript …   Wikipédia en Français

  • Java (langage de programmation) — Java (langage) Pour les articles homonymes, voir Java.  Ne doit pas être confondu avec JavaScript …   Wikipédia en Français

  • Java 5 — Java (langage) Pour les articles homonymes, voir Java.  Ne doit pas être confondu avec JavaScript …   Wikipédia en Français

  • Java OpenGL — (JOGL) est une bibliothèque qui permet d utiliser OpenGL avec le langage de programmation Java[1],[2]. Elle était développée à l origine par Kenneth Bradley Russell et Christopher John Kline, et fut développée par la suite par le Sun Microsystems …   Wikipédia en Français

  • Java (Plattform) — Die Java Plattform (englisch Java Platform) definiert die Ablaufumgebung (Java Virtual Machine) und Programmierschnittstellen (Java Application Programming Interface) innerhalb der Java Technologie. Der Kern der Java Plattform ist die Java… …   Deutsch Wikipedia

  • Java Platform, Standard Edition 6 — Die Java Plattform (englisch Java Platform) definiert die Ablaufumgebung (Java Virtual Machine) und Programmierschnittstellen (Java Application Programming Interface) innerhalb der Java Technologie. Der Kern der Java Plattform ist die Java… …   Deutsch Wikipedia

  • Java Plattform — Die Java Plattform (englisch Java Platform) definiert die Ablaufumgebung (Java Virtual Machine) und Programmierschnittstellen (Java Application Programming Interface) innerhalb der Java Technologie. Der Kern der Java Plattform ist die Java… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”