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