1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* //device/apps/Quake/quake/src/QW/client/main.c
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich**
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** Copyright 2007, The Android Open Source Project
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich**
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** Licensed under the Apache License, Version 2.0 (the "License");
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** you may not use this file except in compliance with the License.
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** You may obtain a copy of the License at
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich**
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich**     http://www.apache.org/licenses/LICENSE-2.0
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich**
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** Unless required by applicable law or agreed to in writing, software
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** distributed under the License is distributed on an "AS IS" BASIS,
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** See the License for the specific language governing permissions and
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich** limitations under the License.
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <nativehelper/jni.h>
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <stdio.h>
20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <assert.h>
21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <dlfcn.h>
22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#define LOG_TAG "QuakeMaster"
24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include <utils/Log.h>
25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidInit();
27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidEvent2(int type, int value);
28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidMotionEvent(unsigned long long eventTime, int action,
29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        float x, float y, float pressure, float size, int deviceId);
30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidTrackballEvent(unsigned long long eventTime, int action,
31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        float x, float y);
32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint AndroidStep(int width, int height);
33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid AndroidQuit();
34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichjboolean
36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqinit(JNIEnv *env, jobject thiz) {
3792c379019827f5076290356a3a0f2509a006eecfSteve Block    ALOGI("qinit");
38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return AndroidInit() ? JNI_TRUE : JNI_FALSE;
39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich }
40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichjboolean
42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqevent(JNIEnv *env, jobject thiz, jint type, jint value) {
43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return AndroidEvent2(type, value) ? JNI_TRUE : JNI_FALSE;
44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichjboolean
47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqmotionevent(JNIEnv *env, jobject thiz, jlong eventTime, jint action,
48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        jfloat x, jfloat y, jfloat pressure, jfloat size, jint deviceId) {
49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return AndroidMotionEvent((unsigned long long) eventTime,
50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich            action, x, y, pressure, size,
51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich            deviceId) ? JNI_TRUE : JNI_FALSE;
52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichjboolean
55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqtrackballevent(JNIEnv *env, jobject thiz, jlong eventTime, jint action,
56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        jfloat x, jfloat y) {
57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return AndroidTrackballEvent((unsigned long long) eventTime,
58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich            action, x, y) ? JNI_TRUE : JNI_FALSE;
59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichjboolean
62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqstep(JNIEnv *env, jobject thiz, jint width, jint height) {
63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return AndroidStep(width, height)  ? JNI_TRUE : JNI_FALSE;
64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid
67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichqquit(JNIEnv *env, jobject thiz) {
6892c379019827f5076290356a3a0f2509a006eecfSteve Block    ALOGI("qquit");
69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    AndroidQuit();
70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich }
71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic const char *classPathName = "com/android/quake/QuakeLib";
73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic JNINativeMethod methods[] = {
75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  {"init", "()Z", (void*)qinit },
76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  {"event", "(II)Z", (void*)qevent },
77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  {"motionEvent", "(JIFFFFI)Z", (void*) qmotionevent },
78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  {"trackballEvent", "(JIFF)Z", (void*) qtrackballevent },
79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  {"step", "(II)Z", (void*)qstep },
80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  {"quit", "()V", (void*)qquit },
81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich};
82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Register several native methods for one class.
85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */
86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic int registerNativeMethods(JNIEnv* env, const char* className,
87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    JNINativeMethod* gMethods, int numMethods)
88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    jclass clazz;
90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    clazz = env->FindClass(className);
92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    if (clazz == NULL) {
93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        fprintf(stderr,
94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich            "Native registration unable to find class '%s'\n", className);
95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        return JNI_FALSE;
96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    }
97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        fprintf(stderr, "RegisterNatives failed for '%s'\n", className);
99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        return JNI_FALSE;
100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    }
101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return JNI_TRUE;
103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Register native methods for all classes we know about.
107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */
108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstatic int registerNatives(JNIEnv* env)
109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  if (!registerNativeMethods(env, classPathName,
111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich                 methods, sizeof(methods) / sizeof(methods[0]))) {
112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return JNI_FALSE;
113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  }
114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich  return JNI_TRUE;
116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Set some test stuff up.
120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich *
121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Returns the JNI version on success, -1 on failure.
122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */
123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef union {
125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    JNIEnv* env;
126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    void* venv;
127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} UnionJNIEnvToVoid;
128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichjint JNI_OnLoad(JavaVM* vm, void* reserved)
130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{
131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    UnionJNIEnvToVoid uenv;
132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    uenv.venv = NULL;
133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    jint result = -1;
134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    JNIEnv* env = NULL;
135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        fprintf(stderr, "ERROR: GetEnv failed\n");
138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        goto bail;
139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    }
140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    env = uenv.env;
141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    assert(env != NULL);
143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    printf("In mgmain JNI_OnLoad\n");
145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    if (!registerNatives(env)) {
147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        fprintf(stderr, "ERROR: quakemaster native registration failed\n");
148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich        goto bail;
149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    }
150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    /* success -- return valid version number */
152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    result = JNI_VERSION_1_4;
153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbail:
155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich    return result;
156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich}
157