| @@ -18,5 +18,5 @@ | |||
| </intent-filter> | |||
| </activity> | |||
| </application> | |||
| <uses-sdk android:minSdkVersion="9" /> | |||
| <uses-sdk android:minSdkVersion="13" /> | |||
| </manifest> | |||
| @@ -31,14 +31,9 @@ public class LolActivity extends NativeActivity | |||
| protected void onCreate(Bundle saved_instance) | |||
| { | |||
| super.onCreate(saved_instance); | |||
| m_assets = getAssets(); | |||
| nativeInit(m_assets); | |||
| } | |||
| private native void nativeInit(AssetManager assets); | |||
| private AssetManager m_assets; | |||
| /* | |||
| @@ -138,7 +138,7 @@ all-local-android: $(foreach p, $(PROGRAMS:%$(EXEEXT)=%), .$(p).androidstamp) | |||
| $(MKDIR_P) "$(d)/libs/armeabi" | |||
| $(LN_S) "$(abs_builddir)/$(p)$(EXEEXT)" "$(d)/libs/armeabi/lib$(p).so" | |||
| $(LN_S) "$${ANDROID_NDK_ROOT}/sources/cxx-stl/stlport/libs/armeabi/libstlport_shared.so" "$(d)/libs/armeabi" | |||
| android update project -t android-9 -n "$(p)" -p "$(d)" | |||
| android update project -t android-19 -n "$(p)" -p "$(d)" | |||
| ant debug -f "$(d)/build.xml" | |||
| touch $@ | |||
| else | |||
| @@ -8,7 +8,7 @@ | |||
| // http://www.wtfpl.net/ for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| #if HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| @@ -26,14 +26,14 @@ void KeyBinding::Bind(const String& device_name, const String& key_name) | |||
| if (!device) | |||
| { | |||
| Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name.C()); | |||
| Log::Warn("Trying to bind key to nonexistent device %s", device_name.C()); | |||
| return; | |||
| } | |||
| int keyindex = device->GetKeyIndex(key_name.C()); | |||
| if (keyindex < 0) | |||
| { | |||
| Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name.C(), key_name.C()); | |||
| Log::Warn("Trying to bind nonexistent key %s.%s", device_name.C(), key_name.C()); | |||
| return; | |||
| } | |||
| @@ -69,14 +69,14 @@ void AxisBinding::Bind(const String& device_name, const String& axis_name) | |||
| const InputDevice* device = InputDevice::Get(device_name.C()); | |||
| if (!device) | |||
| { | |||
| Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name.C()); | |||
| Log::Warn("Trying to bind axis to nonexistent device %s", device_name.C()); | |||
| return; | |||
| } | |||
| int axisindex = device->GetAxisIndex(axis_name.C()); | |||
| if (axisindex < 0) | |||
| { | |||
| Log::Warn("Trying to bind controller to axis %s.%s which doesn't exist", device_name.C(), axis_name.C()); | |||
| Log::Warn("Trying to bind nonexistent axis %s.%s", device_name.C(), axis_name.C()); | |||
| return; | |||
| } | |||
| @@ -88,14 +88,14 @@ void AxisBinding::BindKey(const String& device_name, const String& key_name) | |||
| const InputDevice* device = InputDevice::Get(device_name.C()); | |||
| if (!device) | |||
| { | |||
| Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name.C()); | |||
| Log::Warn("Trying to bind axis key to nonexistent device %s", device_name.C()); | |||
| return; | |||
| } | |||
| int keyindex = device->GetKeyIndex(key_name.C()); | |||
| if (keyindex < 0) | |||
| { | |||
| Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name.C(), key_name.C()); | |||
| Log::Warn("Trying to bind nonexistent axis key %s.%s", device_name.C(), key_name.C()); | |||
| return; | |||
| } | |||
| @@ -107,21 +107,21 @@ void AxisBinding::BindKeys(const String& device_name, const String& min_key_name | |||
| const InputDevice* device = InputDevice::Get(device_name.C()); | |||
| if (!device) | |||
| { | |||
| Log::Warn("Trying to bind controller to device %s which doesn't exist", device_name.C()); | |||
| Log::Warn("Trying to bind axis keys to nonexistent device %s", device_name.C()); | |||
| return; | |||
| } | |||
| int minkeyindex = device->GetKeyIndex(min_key_name.C()); | |||
| if (minkeyindex < 0) | |||
| { | |||
| Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name.C(), min_key_name.C()); | |||
| Log::Warn("Trying to bind nonexistent axis key %s.%s", device_name.C(), min_key_name.C()); | |||
| return; | |||
| } | |||
| int maxkeyindex = device->GetKeyIndex(max_key_name.C()); | |||
| if (maxkeyindex < 0) | |||
| { | |||
| Log::Warn("Trying to bind controller to key %s.%s which doesn't exist", device_name.C(), max_key_name.C()); | |||
| Log::Warn("Trying to bind nonexistent axis key %s.%s", device_name.C(), max_key_name.C()); | |||
| return; | |||
| } | |||
| @@ -231,7 +231,7 @@ Controller::Controller(char const* name, int nb_keys, int nb_axis) | |||
| m_active = false; | |||
| if (Get(name) != nullptr) | |||
| { | |||
| Log::Warn("a controller with this name has already been registered"); | |||
| Log::Warn("controller “%s” has already been registered", name); | |||
| } | |||
| controllers.Push(this); | |||
| } | |||
| @@ -8,13 +8,15 @@ | |||
| // http://www.wtfpl.net/ for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| #if HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #if defined __ANDROID__ | |||
| #if __ANDROID__ | |||
| #include <jni.h> | |||
| #include <sys/types.h> | |||
| #include <android/asset_manager_jni.h> | |||
| #include <EGL/egl.h> | |||
| @@ -35,7 +37,7 @@ using namespace lol; | |||
| namespace lol | |||
| { | |||
| JavaVM *g_vm; | |||
| jobject g_activity; | |||
| ANativeActivity *g_activity; | |||
| AAssetManager *g_assets; | |||
| }; /* namespace lol */ | |||
| @@ -43,21 +45,9 @@ extern "C" jint | |||
| JNI_OnLoad(JavaVM* vm, void* reserved) | |||
| { | |||
| Log::Info("Java layer loading library, vm=0x%08lx", (long)(intptr_t)vm); | |||
| g_vm = vm; | |||
| return JNI_VERSION_1_4; | |||
| } | |||
| extern "C" void | |||
| Java_net_lolengine_LolActivity_nativeInit(JNIEnv* env, jobject thiz, | |||
| jobject assets) | |||
| { | |||
| Log::Info("Java layer initialising activity 0x%08lx", (long)thiz); | |||
| env->NewGlobalRef(thiz); /* FIXME: never released! */ | |||
| g_activity = thiz; | |||
| env->NewGlobalRef(assets); /* FIXME: never released! */ | |||
| g_assets = AAssetManager_fromJava(env, assets); | |||
| } | |||
| /* One of these wrappers will be overridden by the user's version */ | |||
| void lol_android_main(void) __attribute__((weak)); | |||
| void lol_android_main(int argc, char **argv) __attribute__((weak)); | |||
| @@ -161,9 +151,8 @@ int lol::AndroidAppData::CreateDisplay() | |||
| eglQuerySurface(m_display, m_surface, EGL_WIDTH, &w); | |||
| eglQuerySurface(m_display, m_surface, EGL_HEIGHT, &h); | |||
| /* Launch our ticker */ | |||
| Log::Info("Java layer initialising renderer at %g fps", 60.0f); | |||
| Ticker::Setup(60.0f); | |||
| /* Launch our renderer */ | |||
| Log::Info("Java layer initialising renderer"); | |||
| Video::Setup(ivec2(w, h)); | |||
| return 0; | |||
| @@ -278,6 +267,35 @@ void android_main(android_app* native_app) | |||
| { | |||
| Log::Info("Java layer calling main() for app 0x%08lx", (long)native_app); | |||
| /* Register native activity */ | |||
| g_activity = native_app->activity; | |||
| /* Register Java VM */ | |||
| g_vm = g_activity->vm; | |||
| /* Get JNI environment */ | |||
| JNIEnv *jni_env; | |||
| jint res = g_vm->GetEnv((void **)&jni_env, JNI_VERSION_1_2); | |||
| if (res < 0) | |||
| { | |||
| Log::Error("JVM environment not found, trying to attach thread\n"); | |||
| res = g_vm->AttachCurrentThread(&jni_env, nullptr); | |||
| } | |||
| if (res < 0) | |||
| { | |||
| Log::Error("JVM environment not found, cannot run main()\n"); | |||
| return; | |||
| } | |||
| /* Get asset manager */ | |||
| jclass cls = jni_env->GetObjectClass(g_activity->clazz); | |||
| jmethodID mid = jni_env->GetMethodID(cls, "getAssets", | |||
| "()Landroid/content/res/AssetManager;"); | |||
| jobject assets = jni_env->CallObjectMethod(g_activity->clazz, mid); | |||
| jni_env->NewGlobalRef(assets); /* FIXME: never released! */ | |||
| g_assets = AAssetManager_fromJava(jni_env, assets); | |||
| /* Create our app data */ | |||
| g_data = new AndroidAppData(); | |||
| g_data->m_native_app = native_app; | |||
| @@ -298,6 +316,16 @@ void android_main(android_app* native_app) | |||
| char *argv[] = { "", nullptr }; | |||
| char *env[] = { nullptr }; | |||
| /* FIXME: this is fucking pathetic. */ | |||
| while (!g_scene) | |||
| { | |||
| Log::Debug("waiting for g_scene...\n"); | |||
| Timer t; | |||
| t.Wait(0.1); | |||
| } | |||
| Log::Info("running main()\n"); | |||
| /* Call the user's main() function. One of these will work. */ | |||
| lol_android_main(); | |||
| lol_android_main(argc, argv); | |||
| @@ -307,6 +335,10 @@ void android_main(android_app* native_app) | |||
| lol::AndroidApp::AndroidApp(char const *title, ivec2 res, float fps) | |||
| : m_data(g_data) | |||
| { | |||
| /* Launch our ticker */ | |||
| Log::Info("Java layer initialising ticker at %g fps", fps); | |||
| Ticker::Setup(fps); | |||
| m_data->m_wanted_resolution = res; | |||
| m_data->m_mouse = InputDeviceInternal::CreateStandardMouse(); | |||
| } | |||
| @@ -8,14 +8,14 @@ | |||
| // http://www.wtfpl.net/ for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| #if HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| #include <cstdlib> | |||
| #ifdef WIN32 | |||
| # define WIN32_LEAN_AND_MEAN | |||
| #if WIN32 | |||
| # define WIN32_LEAN_AND_MEAN 1 | |||
| # include <windows.h> | |||
| #endif | |||
| @@ -113,12 +113,16 @@ Scene::~Scene() | |||
| void Scene::PushCamera(Camera *cam) | |||
| { | |||
| ASSERT(this, "trying to push a camera before g_scene is ready"); | |||
| Ticker::Ref(cam); | |||
| data->m_camera_stack.Push(cam); | |||
| } | |||
| void Scene::PopCamera(Camera *cam) | |||
| { | |||
| ASSERT(this, "trying to pop a camera before g_scene is ready"); | |||
| /* Parse from the end because that’s probably where we’ll find | |||
| * our camera first. */ | |||
| for (int i = data->m_camera_stack.Count(); i--; ) | |||
| @@ -8,7 +8,7 @@ | |||
| // http://www.wtfpl.net/ for more details. | |||
| // | |||
| #if defined HAVE_CONFIG_H | |||
| #if HAVE_CONFIG_H | |||
| # include "config.h" | |||
| #endif | |||
| @@ -16,6 +16,7 @@ | |||
| # include <sys/paths.h> | |||
| # include <cell/cell_fs.h> | |||
| #elif __ANDROID__ | |||
| # include <sys/types.h> | |||
| # include <android/asset_manager_jni.h> | |||
| #endif | |||