152 lines
3.2 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://sam.zoy.org/projects/COPYING.WTFPL for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #if defined __ANDROID__
  14. #include <jni.h>
  15. #include <android/log.h>
  16. #include "core.h"
  17. #include "loldebug.h"
  18. #include "androidapp.h"
  19. using namespace lol;
  20. /* One of these wrappers will be overridden by the user's version */
  21. void lol_android_main(void) __attribute__((weak));
  22. void lol_android_main(void) {}
  23. void lol_android_main(int argc, char **argv) __attribute__((weak));
  24. void lol_android_main(int argc, char **argv) {}
  25. void lol_android_main(int argc, char **argv, char **envp) __attribute__((weak));
  26. void lol_android_main(int argc, char **argv, char **envp) {}
  27. namespace lol
  28. {
  29. JavaVM *g_vm;
  30. jobject g_activity;
  31. Thread *g_main_thread;
  32. AndroidApp::AndroidApp(char const *title, ivec2 res, float fps) :
  33. data(0)
  34. {
  35. }
  36. void AndroidApp::ShowPointer(bool show)
  37. {
  38. }
  39. void AndroidApp::Run()
  40. {
  41. while (!Ticker::Finished())
  42. {
  43. /* Tick the renderer, show the frame and clamp to desired framerate. */
  44. Ticker::TickDraw();
  45. }
  46. }
  47. void *AndroidApp::MainRun(void *data)
  48. {
  49. int argc = 1;
  50. char *argv[] = { "", NULL };
  51. char *env[] = { NULL };
  52. /* Call the user's main() function. One of these will work. */
  53. lol_android_main();
  54. lol_android_main(argc, argv);
  55. lol_android_main(argc, argv, env);
  56. return NULL;
  57. }
  58. AndroidApp::~AndroidApp()
  59. {
  60. }
  61. };
  62. extern "C" jint
  63. JNI_OnLoad(JavaVM* vm, void* reserved)
  64. {
  65. g_vm = vm;
  66. return JNI_VERSION_1_4;
  67. }
  68. extern "C" void
  69. Java_org_zoy_LolEngine_LolActivity_nativeInit(JNIEnv* env, jobject thiz)
  70. {
  71. env->NewGlobalRef(thiz); /* FIXME: never released! */
  72. g_activity = thiz;
  73. }
  74. extern "C" void
  75. Java_org_zoy_LolEngine_LolRenderer_nativeInit(JNIEnv* env)
  76. {
  77. Log::Info("initialising renderer");
  78. Ticker::Setup(30.0f);
  79. Video::Setup(ivec2(320, 200));
  80. g_main_thread = new Thread(lol::AndroidApp::MainRun, NULL);;
  81. }
  82. extern "C" void
  83. Java_org_zoy_LolEngine_LolRenderer_nativeResize(JNIEnv* env, jobject thiz,
  84. jint w, jint h)
  85. {
  86. Log::Info("resizing to %i x %i", w, h);
  87. Video::Setup(ivec2(w, h));
  88. }
  89. extern "C" void
  90. Java_org_zoy_LolEngine_LolRenderer_nativeDone(JNIEnv* env)
  91. {
  92. /* FIXME: clean up */
  93. delete g_main_thread;
  94. }
  95. extern "C" void
  96. Java_org_zoy_LolEngine_LolView_nativePause(JNIEnv* env)
  97. {
  98. /* TODO: unimplemented */
  99. }
  100. extern "C" void
  101. Java_org_zoy_LolEngine_LolView_nativeDown(JNIEnv* env)
  102. {
  103. Input::SetMouseButton(0);
  104. }
  105. extern "C" void
  106. Java_org_zoy_LolEngine_LolView_nativeUp(JNIEnv* env)
  107. {
  108. Input::UnsetMouseButton(0);
  109. }
  110. extern "C" void
  111. Java_org_zoy_LolEngine_LolView_nativeMove(JNIEnv* env, jobject thiz,
  112. jint x, jint y)
  113. {
  114. ivec2 pos = ivec2(0, 479) + ivec2(x * 640, -y * 480) / Video::GetSize();
  115. Input::SetMousePos(pos);
  116. }
  117. /* Call to render the next GL frame */
  118. extern "C" void
  119. Java_org_zoy_LolEngine_LolRenderer_nativeRender(JNIEnv* env)
  120. {
  121. Ticker::TickDraw();
  122. }
  123. #endif /* __ANDROID__ */