// // Lol Engine // // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> // This program is free software; you can redistribute it and/or // modify it under the terms of the Do What The Fuck You Want To // Public License, Version 2, as published by Sam Hocevar. See // http://sam.zoy.org/projects/COPYING.WTFPL for more details. // #if defined HAVE_CONFIG_H # include "config.h" #endif #if defined __ANDROID__ #include <jni.h> #include <android/log.h> #include "core.h" #include "loldebug.h" #include "androidapp.h" using namespace lol; /* One of these wrappers will be overridden by the user's version */ void lol_android_main(void) __attribute__((weak)); void lol_android_main(void) {} void lol_android_main(int argc, char **argv) __attribute__((weak)); void lol_android_main(int argc, char **argv) {} void lol_android_main(int argc, char **argv, char **envp) __attribute__((weak)); void lol_android_main(int argc, char **argv, char **envp) {} namespace lol { JavaVM *g_vm; jobject g_activity; Thread *g_main_thread; AndroidApp::AndroidApp(char const *title, ivec2 res, float fps) : data(0) { } void AndroidApp::ShowPointer(bool show) { } void AndroidApp::Run() { while (!Ticker::Finished()) { /* Tick the renderer, show the frame and clamp to desired framerate. */ Ticker::TickDraw(); } } void *AndroidApp::MainRun(void *data) { int argc = 1; char *argv[] = { "", NULL }; char *env[] = { NULL }; /* Call the user's main() function. One of these will work. */ lol_android_main(); lol_android_main(argc, argv); lol_android_main(argc, argv, env); return NULL; } AndroidApp::~AndroidApp() { } }; extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) { g_vm = vm; return JNI_VERSION_1_4; } extern "C" void Java_org_zoy_LolEngine_LolActivity_nativeInit(JNIEnv* env, jobject thiz) { env->NewGlobalRef(thiz); /* FIXME: never released! */ g_activity = thiz; } extern "C" void Java_org_zoy_LolEngine_LolRenderer_nativeInit(JNIEnv* env) { Log::Info("initialising renderer"); Ticker::Setup(30.0f); Video::Setup(ivec2(320, 200)); g_main_thread = new Thread(lol::AndroidApp::MainRun, NULL);; } extern "C" void Java_org_zoy_LolEngine_LolRenderer_nativeResize(JNIEnv* env, jobject thiz, jint w, jint h) { Log::Info("resizing to %i x %i", w, h); Video::Setup(ivec2(w, h)); } extern "C" void Java_org_zoy_LolEngine_LolRenderer_nativeDone(JNIEnv* env) { /* FIXME: clean up */ delete g_main_thread; } extern "C" void Java_org_zoy_LolEngine_LolView_nativePause(JNIEnv* env) { /* TODO: unimplemented */ } extern "C" void Java_org_zoy_LolEngine_LolView_nativeDown(JNIEnv* env) { Input::SetMouseButton(0); } extern "C" void Java_org_zoy_LolEngine_LolView_nativeUp(JNIEnv* env) { Input::UnsetMouseButton(0); } extern "C" void Java_org_zoy_LolEngine_LolView_nativeMove(JNIEnv* env, jobject thiz, jint x, jint y) { ivec2 pos = ivec2(0, 479) + ivec2(x * 640, -y * 480) / Video::GetSize(); Input::SetMousePos(pos); } /* Call to render the next GL frame */ extern "C" void Java_org_zoy_LolEngine_LolRenderer_nativeRender(JNIEnv* env) { Ticker::TickDraw(); } #endif /* __ANDROID__ */