Game Development Reference
In-Depth Information
For improved performance, static references to the Java native interface class ( doom.jni.Natives )
are kept in jNativesCls . References to the Java methods to send the video image ( jSendImageMethod ) and
sound file ( jStartSoundMethod ) are also kept. This is because these methods will be invoked multiple
times, and looking up this names every time can slow things.
static jclass jNativesCls;
static jmethodID jSendImageMethod;
static jmethodID jStartSoundMethod;
Also, since you may send a pixel buffer (image) multiple times per second, you should keep a
reference to the Java array and its size, as in the next fragment:
static jintArray jImage;
static int iSize;
extern int doom_main(int argc, char **argv);
The line extern int doom_main defines the main engine function and tells the compiler it is defined
somewhere else in the library. The header jni_doom.h included up front defines the constants and
method signatures required to invoke the C to Java callbacks. For example, the next fragment of the
header defines constants for the Java native interface class ( doom/jni/Natives ), and the method names
and signatures for the callbacks OnImageUpdate and OnStartSound (see the “C to Java Callbacks” section
for more details).
#define CB_CLASS "doom/jni/Natives"
#define CB_CLASS_IU_CB "OnImageUpdate"
#define CB_CLASS_IU_SIG "([I)V"
#define CB_CLASS_SS_CB "OnStartSound"
#define CB_CLASS_SS_SIG "([BI)V"
Let's take a look at the actual implementations. They are divided in three groups:
Native game loop : This invokes the engine loop doom_main .
Key and motion events : These post key and motion events to the engine.
C to Java callbacks : These callbacks are critical for the Java code to receive
information from the Doom engine.
Native Game Loop
The native game loop's job is to extract the arguments sent as a jobjectArray into a C char ** array and
invoke the main Doom engine function ( doom_main ). This function performs additional steps:
Obtain a reference to the JVM using (*env)->GetJavaVM(env, &g_VM) . This
reference will be used by the C to Java callbacks.
Load the doom.jni.Natives class, also used by the C to Java callbacks: jNativesCls
= (*env)->FindClass(env, “doom/jni/Natives”) .
Search WWH ::




Custom Search