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”)
.
•