From 257913676d5a21c6192a6146e662c21f299c9b09 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sun, 20 Feb 2011 17:01:46 +0100 Subject: ANDROID: Split code into multiple files And get rid of unnecessary JNI calls to get a pointer to g_system --- backends/platform/android/jni.cpp | 387 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 387 insertions(+) create mode 100644 backends/platform/android/jni.cpp (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp new file mode 100644 index 0000000000..0f1366148f --- /dev/null +++ b/backends/platform/android/jni.cpp @@ -0,0 +1,387 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#if defined(__ANDROID__) + +#include "base/main.h" +#include "common/config-manager.h" + +#include "backends/platform/android/android.h" + +// Fix JNIEXPORT declaration to actually do something useful +#undef JNIEXPORT +#define JNIEXPORT __attribute__ ((visibility("default"))) + +static JavaVM *cached_jvm; +static jfieldID FID_Event_type; +static jfieldID FID_Event_synthetic; +static jfieldID FID_Event_kbd_keycode; +static jfieldID FID_Event_kbd_ascii; +static jfieldID FID_Event_kbd_flags; +static jfieldID FID_Event_mouse_x; +static jfieldID FID_Event_mouse_y; +static jfieldID FID_Event_mouse_relative; +static jfieldID FID_ScummVM_nativeScummVM; +static jmethodID MID_Object_wait; + +JNIEnv *JNU_GetEnv() { + JNIEnv *env = 0; + + jint res = cached_jvm->GetEnv((void **)&env, JNI_VERSION_1_2); + + if (res != JNI_OK) { + LOGE("GetEnv() failed: %d", res); + abort(); + } + + return env; +} + +void JNU_AttachThread() { + JNIEnv *env = 0; + jint res = cached_jvm->AttachCurrentThread(&env, 0); + + if (res != JNI_OK) { + LOGE("AttachCurrentThread() failed: %d", res); + abort(); + } +} + +void JNU_DetachThread() { + jint res = cached_jvm->DetachCurrentThread(); + + if (res != JNI_OK) { + LOGE("DetachCurrentThread() failed: %d", res); + abort(); + } +} + +static void JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg) { + jclass cls = env->FindClass(name); + + // if cls is 0, an exception has already been thrown + if (cls != 0) + env->ThrowNew(cls, msg); + + env->DeleteLocalRef(cls); +} + +static void ScummVM_create(JNIEnv *env, jobject self, jobject am) { + assert(!g_system); + + g_sys = new OSystem_Android(am); + assert(g_sys); + + // Exception already thrown by initJavaHooks? + if (!g_sys->initJavaHooks(env, self)) + return; + + env->SetLongField(self, FID_ScummVM_nativeScummVM, (jlong)g_sys); + + g_system = g_sys; +} + +static void ScummVM_nativeDestroy(JNIEnv *env, jobject self) { + assert(g_sys); + + OSystem_Android *tmp = g_sys; + g_system = 0; + g_sys = 0; + delete tmp; +} + +static jint ScummVM_scummVMMain(JNIEnv *env, jobject self, jobjectArray args) { + assert(g_sys); + + const int MAX_NARGS = 32; + int res = -1; + + int argc = env->GetArrayLength(args); + if (argc > MAX_NARGS) { + JNU_ThrowByName(env, "java/lang/IllegalArgumentException", + "too many arguments"); + return 0; + } + + char *argv[MAX_NARGS]; + + // note use in cleanup loop below + int nargs; + + for (nargs = 0; nargs < argc; ++nargs) { + jstring arg = (jstring)env->GetObjectArrayElement(args, nargs); + + if (arg == 0) { + argv[nargs] = 0; + } else { + const char *cstr = env->GetStringUTFChars(arg, 0); + + argv[nargs] = const_cast(cstr); + + // exception already thrown? + if (cstr == 0) + goto cleanup; + } + + env->DeleteLocalRef(arg); + } + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new AndroidPluginProvider()); +#endif + + LOGI("Entering scummvm_main with %d args", argc); + + res = scummvm_main(argc, argv); + + LOGI("Exiting scummvm_main"); + + g_sys->quit(); + +cleanup: + nargs--; + + for (int i = 0; i < nargs; ++i) { + if (argv[i] == 0) + continue; + + jstring arg = (jstring)env->GetObjectArrayElement(args, nargs); + + // Exception already thrown? + if (arg == 0) + return res; + + env->ReleaseStringUTFChars(arg, argv[i]); + env->DeleteLocalRef(arg); + } + + return res; +} + +static void ScummVM_pushEvent(JNIEnv *env, jobject self, jobject java_event) { + assert(g_sys); + + Common::Event event; + event.type = (Common::EventType)env->GetIntField(java_event, + FID_Event_type); + + event.synthetic = + env->GetBooleanField(java_event, FID_Event_synthetic); + + switch (event.type) { + case Common::EVENT_KEYDOWN: + case Common::EVENT_KEYUP: + event.kbd.keycode = (Common::KeyCode)env->GetIntField( + java_event, FID_Event_kbd_keycode); + event.kbd.ascii = static_cast(env->GetIntField( + java_event, FID_Event_kbd_ascii)); + event.kbd.flags = static_cast(env->GetIntField( + java_event, FID_Event_kbd_flags)); + break; + case Common::EVENT_MOUSEMOVE: + case Common::EVENT_LBUTTONDOWN: + case Common::EVENT_LBUTTONUP: + case Common::EVENT_RBUTTONDOWN: + case Common::EVENT_RBUTTONUP: + case Common::EVENT_WHEELUP: + case Common::EVENT_WHEELDOWN: + case Common::EVENT_MBUTTONDOWN: + case Common::EVENT_MBUTTONUP: + event.mouse.x = + env->GetIntField(java_event, FID_Event_mouse_x); + event.mouse.y = + env->GetIntField(java_event, FID_Event_mouse_y); + // This is a terrible hack. We stash "relativeness" + // in the kbd.flags field until pollEvent() can work + // it out. + event.kbd.flags = env->GetBooleanField( + java_event, FID_Event_mouse_relative) ? 1 : 0; + break; + default: + break; + } + + g_sys->pushEvent(event); +} + +static void ScummVM_audioMixCallback(JNIEnv *env, jobject self, + jbyteArray jbuf) { + assert(g_sys); + + jsize len = env->GetArrayLength(jbuf); + jbyte *buf = env->GetByteArrayElements(jbuf, 0); + + if (buf == 0) { + warning("Unable to get Java audio byte array. Skipping"); + return; + } + + Audio::MixerImpl *mixer = + static_cast(g_sys->getMixer()); + assert(mixer); + mixer->mixCallback(reinterpret_cast(buf), len); + + env->ReleaseByteArrayElements(jbuf, buf, 0); +} + +static void ScummVM_setConfManInt(JNIEnv *env, jclass cls, + jstring key_obj, jint value) { + ENTER("%p, %d", key_obj, (int)value); + + const char *key = env->GetStringUTFChars(key_obj, 0); + + if (key == 0) + return; + + ConfMan.setInt(key, value); + + env->ReleaseStringUTFChars(key_obj, key); +} + +static void ScummVM_setConfManString(JNIEnv *env, jclass cls, jstring key_obj, + jstring value_obj) { + ENTER("%p, %p", key_obj, value_obj); + + const char *key = env->GetStringUTFChars(key_obj, 0); + + if (key == 0) + return; + + const char *value = env->GetStringUTFChars(value_obj, 0); + + if (value == 0) { + env->ReleaseStringUTFChars(key_obj, key); + return; + } + + ConfMan.set(key, value); + + env->ReleaseStringUTFChars(value_obj, value); + env->ReleaseStringUTFChars(key_obj, key); +} + +static void ScummVM_enableZoning(JNIEnv *env, jobject self, jboolean enable) { + assert(g_sys); + + g_sys->enableZoning(enable); +} + +static void ScummVM_setSurfaceSize(JNIEnv *env, jobject self, + jint width, jint height) { + assert(g_sys); + + g_sys->setSurfaceSize(width, height); +} + +const static JNINativeMethod gMethods[] = { + { "create", "(Landroid/content/res/AssetManager;)V", + (void *)ScummVM_create }, + { "nativeDestroy", "()V", + (void *)ScummVM_nativeDestroy }, + { "scummVMMain", "([Ljava/lang/String;)I", + (void *)ScummVM_scummVMMain }, + { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", + (void *)ScummVM_pushEvent }, + { "audioMixCallback", "([B)V", + (void *)ScummVM_audioMixCallback }, + { "setConfMan", "(Ljava/lang/String;I)V", + (void *)ScummVM_setConfManInt }, + { "setConfMan", "(Ljava/lang/String;Ljava/lang/String;)V", + (void *)ScummVM_setConfManString }, + { "enableZoning", "(Z)V", + (void *)ScummVM_enableZoning }, + { "setSurfaceSize", "(II)V", + (void *)ScummVM_setSurfaceSize }, +}; + +JNIEXPORT jint JNICALL +JNI_OnLoad(JavaVM *jvm, void *reserved) { + cached_jvm = jvm; + + JNIEnv *env; + + if (jvm->GetEnv((void **)&env, JNI_VERSION_1_2)) + return JNI_ERR; + + jclass cls = env->FindClass("org/inodes/gus/scummvm/ScummVM"); + if (cls == 0) + return JNI_ERR; + + if (env->RegisterNatives(cls, gMethods, ARRAYSIZE(gMethods)) < 0) + return JNI_ERR; + + FID_ScummVM_nativeScummVM = env->GetFieldID(cls, "nativeScummVM", "J"); + if (FID_ScummVM_nativeScummVM == 0) + return JNI_ERR; + + jclass event = env->FindClass("org/inodes/gus/scummvm/Event"); + if (event == 0) + return JNI_ERR; + + FID_Event_type = env->GetFieldID(event, "type", "I"); + if (FID_Event_type == 0) + return JNI_ERR; + + FID_Event_synthetic = env->GetFieldID(event, "synthetic", "Z"); + if (FID_Event_synthetic == 0) + return JNI_ERR; + + FID_Event_kbd_keycode = env->GetFieldID(event, "kbd_keycode", "I"); + if (FID_Event_kbd_keycode == 0) + return JNI_ERR; + + FID_Event_kbd_ascii = env->GetFieldID(event, "kbd_ascii", "I"); + if (FID_Event_kbd_ascii == 0) + return JNI_ERR; + + FID_Event_kbd_flags = env->GetFieldID(event, "kbd_flags", "I"); + if (FID_Event_kbd_flags == 0) + return JNI_ERR; + + FID_Event_mouse_x = env->GetFieldID(event, "mouse_x", "I"); + if (FID_Event_mouse_x == 0) + return JNI_ERR; + + FID_Event_mouse_y = env->GetFieldID(event, "mouse_y", "I"); + if (FID_Event_mouse_y == 0) + return JNI_ERR; + + FID_Event_mouse_relative = env->GetFieldID(event, "mouse_relative", "Z"); + if (FID_Event_mouse_relative == 0) + return JNI_ERR; + + cls = env->FindClass("java/lang/Object"); + if (cls == 0) + return JNI_ERR; + + MID_Object_wait = env->GetMethodID(cls, "wait", "()V"); + if (MID_Object_wait == 0) + return JNI_ERR; + + return JNI_VERSION_1_2; +} + +#endif + -- cgit v1.2.3 From 4af28f96ab4075cb5e512d4050ac085df73a029a Mon Sep 17 00:00:00 2001 From: dhewg Date: Sun, 20 Feb 2011 20:16:51 +0100 Subject: ANDROID: Remove unused jmethod Object.wait() --- backends/platform/android/jni.cpp | 9 --------- 1 file changed, 9 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 0f1366148f..e5d0f71f53 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -44,7 +44,6 @@ static jfieldID FID_Event_mouse_x; static jfieldID FID_Event_mouse_y; static jfieldID FID_Event_mouse_relative; static jfieldID FID_ScummVM_nativeScummVM; -static jmethodID MID_Object_wait; JNIEnv *JNU_GetEnv() { JNIEnv *env = 0; @@ -372,14 +371,6 @@ JNI_OnLoad(JavaVM *jvm, void *reserved) { if (FID_Event_mouse_relative == 0) return JNI_ERR; - cls = env->FindClass("java/lang/Object"); - if (cls == 0) - return JNI_ERR; - - MID_Object_wait = env->GetMethodID(cls, "wait", "()V"); - if (MID_Object_wait == 0) - return JNI_ERR; - return JNI_VERSION_1_2; } -- cgit v1.2.3 From c4706733d45de09803b7cd40c3536a4e04b4f767 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sun, 20 Feb 2011 20:46:17 +0100 Subject: ANDROID: Move the global back reference to jni.cpp --- backends/platform/android/jni.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index e5d0f71f53..b81587b3ba 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -34,7 +34,10 @@ #undef JNIEXPORT #define JNIEXPORT __attribute__ ((visibility("default"))) +jobject back_ptr; + static JavaVM *cached_jvm; + static jfieldID FID_Event_type; static jfieldID FID_Event_synthetic; static jfieldID FID_Event_kbd_keycode; @@ -93,8 +96,13 @@ static void ScummVM_create(JNIEnv *env, jobject self, jobject am) { g_sys = new OSystem_Android(am); assert(g_sys); + // weak global ref to allow class to be unloaded + // ... except dalvik implements NewWeakGlobalRef only on froyo + //back_ptr = env->NewWeakGlobalRef(self); + back_ptr = env->NewGlobalRef(self); + // Exception already thrown by initJavaHooks? - if (!g_sys->initJavaHooks(env, self)) + if (!g_sys->initJavaHooks(env)) return; env->SetLongField(self, FID_ScummVM_nativeScummVM, (jlong)g_sys); @@ -109,6 +117,10 @@ static void ScummVM_nativeDestroy(JNIEnv *env, jobject self) { g_system = 0; g_sys = 0; delete tmp; + + // see above + //JNU_GetEnv()->DeleteWeakGlobalRef(back_ptr); + JNU_GetEnv()->DeleteGlobalRef(back_ptr); } static jint ScummVM_scummVMMain(JNIEnv *env, jobject self, jobjectArray args) { -- cgit v1.2.3 From f80d993860257a8e74936bc74eb99bda2fbfcaa4 Mon Sep 17 00:00:00 2001 From: dhewg Date: Wed, 23 Feb 2011 22:44:33 +0100 Subject: ANDROID: Wrap JNI code in a class --- backends/platform/android/jni.cpp | 301 +++++++++++++++++++------------------- 1 file changed, 154 insertions(+), 147 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index b81587b3ba..4fa08ef7ab 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -30,28 +30,116 @@ #include "backends/platform/android/android.h" -// Fix JNIEXPORT declaration to actually do something useful -#undef JNIEXPORT -#define JNIEXPORT __attribute__ ((visibility("default"))) - jobject back_ptr; -static JavaVM *cached_jvm; +__attribute__ ((visibility("default"))) +jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { + return JNI::onLoad(vm); +} + +JavaVM *JNI::_vm = 0; +jobject JNI::_jobj = 0; +OSystem_Android *JNI::_system = 0; + +jfieldID JNI::_FID_Event_type = 0; +jfieldID JNI::_FID_Event_synthetic = 0; +jfieldID JNI::_FID_Event_kbd_keycode = 0; +jfieldID JNI::_FID_Event_kbd_ascii = 0; +jfieldID JNI::_FID_Event_kbd_flags = 0; +jfieldID JNI::_FID_Event_mouse_x = 0; +jfieldID JNI::_FID_Event_mouse_y = 0; +jfieldID JNI::_FID_Event_mouse_relative = 0; +jfieldID JNI::_FID_ScummVM_nativeScummVM = 0; + +const JNINativeMethod JNI::_natives[] = { + { "create", "(Landroid/content/res/AssetManager;)V", + (void *)JNI::create }, + { "nativeDestroy", "()V", + (void *)JNI::destroy }, + { "scummVMMain", "([Ljava/lang/String;)I", + (void *)JNI::main }, + { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", + (void *)JNI::pushEvent }, + { "audioMixCallback", "([B)V", + (void *)JNI::audioMixCallback }, + { "setConfMan", "(Ljava/lang/String;I)V", + (void *)JNI::setConfManInt }, + { "setConfMan", "(Ljava/lang/String;Ljava/lang/String;)V", + (void *)JNI::setConfManString }, + { "enableZoning", "(Z)V", + (void *)JNI::enableZoning }, + { "setSurfaceSize", "(II)V", + (void *)JNI::setSurfaceSize }, +}; + +JNI::JNI() { +} + +JNI::~JNI() { +} + +jint JNI::onLoad(JavaVM *vm) { + _vm = vm; + + JNIEnv *env; + + if (_vm->GetEnv((void **)&env, JNI_VERSION_1_2)) + return JNI_ERR; + + jclass cls = env->FindClass("org/inodes/gus/scummvm/ScummVM"); + if (cls == 0) + return JNI_ERR; + + if (env->RegisterNatives(cls, _natives, ARRAYSIZE(_natives)) < 0) + return JNI_ERR; + + _FID_ScummVM_nativeScummVM = env->GetFieldID(cls, "nativeScummVM", "J"); + if (_FID_ScummVM_nativeScummVM == 0) + return JNI_ERR; + + jclass event = env->FindClass("org/inodes/gus/scummvm/Event"); + if (event == 0) + return JNI_ERR; + + _FID_Event_type = env->GetFieldID(event, "type", "I"); + if (_FID_Event_type == 0) + return JNI_ERR; + + _FID_Event_synthetic = env->GetFieldID(event, "synthetic", "Z"); + if (_FID_Event_synthetic == 0) + return JNI_ERR; + + _FID_Event_kbd_keycode = env->GetFieldID(event, "kbd_keycode", "I"); + if (_FID_Event_kbd_keycode == 0) + return JNI_ERR; + + _FID_Event_kbd_ascii = env->GetFieldID(event, "kbd_ascii", "I"); + if (_FID_Event_kbd_ascii == 0) + return JNI_ERR; + + _FID_Event_kbd_flags = env->GetFieldID(event, "kbd_flags", "I"); + if (_FID_Event_kbd_flags == 0) + return JNI_ERR; + + _FID_Event_mouse_x = env->GetFieldID(event, "mouse_x", "I"); + if (_FID_Event_mouse_x == 0) + return JNI_ERR; + + _FID_Event_mouse_y = env->GetFieldID(event, "mouse_y", "I"); + if (_FID_Event_mouse_y == 0) + return JNI_ERR; + + _FID_Event_mouse_relative = env->GetFieldID(event, "mouse_relative", "Z"); + if (_FID_Event_mouse_relative == 0) + return JNI_ERR; -static jfieldID FID_Event_type; -static jfieldID FID_Event_synthetic; -static jfieldID FID_Event_kbd_keycode; -static jfieldID FID_Event_kbd_ascii; -static jfieldID FID_Event_kbd_flags; -static jfieldID FID_Event_mouse_x; -static jfieldID FID_Event_mouse_y; -static jfieldID FID_Event_mouse_relative; -static jfieldID FID_ScummVM_nativeScummVM; + return JNI_VERSION_1_2; +} -JNIEnv *JNU_GetEnv() { +JNIEnv *JNI::getEnv() { JNIEnv *env = 0; - jint res = cached_jvm->GetEnv((void **)&env, JNI_VERSION_1_2); + jint res = _vm->GetEnv((void **)&env, JNI_VERSION_1_2); if (res != JNI_OK) { LOGE("GetEnv() failed: %d", res); @@ -61,9 +149,10 @@ JNIEnv *JNU_GetEnv() { return env; } -void JNU_AttachThread() { +void JNI::attachThread() { JNIEnv *env = 0; - jint res = cached_jvm->AttachCurrentThread(&env, 0); + + jint res = _vm->AttachCurrentThread(&env, 0); if (res != JNI_OK) { LOGE("AttachCurrentThread() failed: %d", res); @@ -71,8 +160,8 @@ void JNU_AttachThread() { } } -void JNU_DetachThread() { - jint res = cached_jvm->DetachCurrentThread(); +void JNI::detachThread() { + jint res = _vm->DetachCurrentThread(); if (res != JNI_OK) { LOGE("DetachCurrentThread() failed: %d", res); @@ -80,7 +169,7 @@ void JNU_DetachThread() { } } -static void JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg) { +void JNI::throwByName(JNIEnv *env, const char *name, const char *msg) { jclass cls = env->FindClass(name); // if cls is 0, an exception has already been thrown @@ -90,49 +179,50 @@ static void JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg) { env->DeleteLocalRef(cls); } -static void ScummVM_create(JNIEnv *env, jobject self, jobject am) { - assert(!g_system); +void JNI::create(JNIEnv *env, jobject self, jobject am) { + assert(!_system); - g_sys = new OSystem_Android(am); - assert(g_sys); + _system = new OSystem_Android(am); + assert(_system); // weak global ref to allow class to be unloaded // ... except dalvik implements NewWeakGlobalRef only on froyo - //back_ptr = env->NewWeakGlobalRef(self); - back_ptr = env->NewGlobalRef(self); + //_jobj = env->NewWeakGlobalRef(self); + _jobj = env->NewGlobalRef(self); + back_ptr = _jobj; // Exception already thrown by initJavaHooks? - if (!g_sys->initJavaHooks(env)) + if (!_system->initJavaHooks(env)) return; - env->SetLongField(self, FID_ScummVM_nativeScummVM, (jlong)g_sys); + env->SetLongField(self, _FID_ScummVM_nativeScummVM, (jlong)_system); - g_system = g_sys; + g_system = _system; } -static void ScummVM_nativeDestroy(JNIEnv *env, jobject self) { - assert(g_sys); +void JNI::destroy(JNIEnv *env, jobject self) { + assert(_system); - OSystem_Android *tmp = g_sys; + OSystem_Android *tmp = _system; g_system = 0; - g_sys = 0; + _system = 0; delete tmp; // see above - //JNU_GetEnv()->DeleteWeakGlobalRef(back_ptr); - JNU_GetEnv()->DeleteGlobalRef(back_ptr); + //JNI::getEnv()->DeleteWeakGlobalRef(_jobj); + JNI::getEnv()->DeleteGlobalRef(_jobj); } -static jint ScummVM_scummVMMain(JNIEnv *env, jobject self, jobjectArray args) { - assert(g_sys); +jint JNI::main(JNIEnv *env, jobject self, jobjectArray args) { + assert(_system); const int MAX_NARGS = 32; int res = -1; int argc = env->GetArrayLength(args); if (argc > MAX_NARGS) { - JNU_ThrowByName(env, "java/lang/IllegalArgumentException", - "too many arguments"); + throwByName(env, "java/lang/IllegalArgumentException", + "too many arguments"); return 0; } @@ -169,7 +259,7 @@ static jint ScummVM_scummVMMain(JNIEnv *env, jobject self, jobjectArray args) { LOGI("Exiting scummvm_main"); - g_sys->quit(); + _system->quit(); cleanup: nargs--; @@ -191,25 +281,25 @@ cleanup: return res; } -static void ScummVM_pushEvent(JNIEnv *env, jobject self, jobject java_event) { - assert(g_sys); +void JNI::pushEvent(JNIEnv *env, jobject self, jobject java_event) { + assert(_system); Common::Event event; event.type = (Common::EventType)env->GetIntField(java_event, - FID_Event_type); + _FID_Event_type); event.synthetic = - env->GetBooleanField(java_event, FID_Event_synthetic); + env->GetBooleanField(java_event, _FID_Event_synthetic); switch (event.type) { case Common::EVENT_KEYDOWN: case Common::EVENT_KEYUP: event.kbd.keycode = (Common::KeyCode)env->GetIntField( - java_event, FID_Event_kbd_keycode); + java_event, _FID_Event_kbd_keycode); event.kbd.ascii = static_cast(env->GetIntField( - java_event, FID_Event_kbd_ascii)); + java_event, _FID_Event_kbd_ascii)); event.kbd.flags = static_cast(env->GetIntField( - java_event, FID_Event_kbd_flags)); + java_event, _FID_Event_kbd_flags)); break; case Common::EVENT_MOUSEMOVE: case Common::EVENT_LBUTTONDOWN: @@ -221,25 +311,24 @@ static void ScummVM_pushEvent(JNIEnv *env, jobject self, jobject java_event) { case Common::EVENT_MBUTTONDOWN: case Common::EVENT_MBUTTONUP: event.mouse.x = - env->GetIntField(java_event, FID_Event_mouse_x); + env->GetIntField(java_event, _FID_Event_mouse_x); event.mouse.y = - env->GetIntField(java_event, FID_Event_mouse_y); + env->GetIntField(java_event, _FID_Event_mouse_y); // This is a terrible hack. We stash "relativeness" // in the kbd.flags field until pollEvent() can work // it out. event.kbd.flags = env->GetBooleanField( - java_event, FID_Event_mouse_relative) ? 1 : 0; + java_event, _FID_Event_mouse_relative) ? 1 : 0; break; default: break; } - g_sys->pushEvent(event); + _system->pushEvent(event); } -static void ScummVM_audioMixCallback(JNIEnv *env, jobject self, - jbyteArray jbuf) { - assert(g_sys); +void JNI::audioMixCallback(JNIEnv *env, jobject self, jbyteArray jbuf) { + assert(_system); jsize len = env->GetArrayLength(jbuf); jbyte *buf = env->GetByteArrayElements(jbuf, 0); @@ -250,15 +339,14 @@ static void ScummVM_audioMixCallback(JNIEnv *env, jobject self, } Audio::MixerImpl *mixer = - static_cast(g_sys->getMixer()); + static_cast(_system->getMixer()); assert(mixer); mixer->mixCallback(reinterpret_cast(buf), len); env->ReleaseByteArrayElements(jbuf, buf, 0); } -static void ScummVM_setConfManInt(JNIEnv *env, jclass cls, - jstring key_obj, jint value) { +void JNI::setConfManInt(JNIEnv *env, jclass cls, jstring key_obj, jint value) { ENTER("%p, %d", key_obj, (int)value); const char *key = env->GetStringUTFChars(key_obj, 0); @@ -271,8 +359,8 @@ static void ScummVM_setConfManInt(JNIEnv *env, jclass cls, env->ReleaseStringUTFChars(key_obj, key); } -static void ScummVM_setConfManString(JNIEnv *env, jclass cls, jstring key_obj, - jstring value_obj) { +void JNI::setConfManString(JNIEnv *env, jclass cls, jstring key_obj, + jstring value_obj) { ENTER("%p, %p", key_obj, value_obj); const char *key = env->GetStringUTFChars(key_obj, 0); @@ -293,97 +381,16 @@ static void ScummVM_setConfManString(JNIEnv *env, jclass cls, jstring key_obj, env->ReleaseStringUTFChars(key_obj, key); } -static void ScummVM_enableZoning(JNIEnv *env, jobject self, jboolean enable) { - assert(g_sys); +void JNI::enableZoning(JNIEnv *env, jobject self, jboolean enable) { + assert(_system); - g_sys->enableZoning(enable); + _system->enableZoning(enable); } -static void ScummVM_setSurfaceSize(JNIEnv *env, jobject self, - jint width, jint height) { - assert(g_sys); - - g_sys->setSurfaceSize(width, height); -} - -const static JNINativeMethod gMethods[] = { - { "create", "(Landroid/content/res/AssetManager;)V", - (void *)ScummVM_create }, - { "nativeDestroy", "()V", - (void *)ScummVM_nativeDestroy }, - { "scummVMMain", "([Ljava/lang/String;)I", - (void *)ScummVM_scummVMMain }, - { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", - (void *)ScummVM_pushEvent }, - { "audioMixCallback", "([B)V", - (void *)ScummVM_audioMixCallback }, - { "setConfMan", "(Ljava/lang/String;I)V", - (void *)ScummVM_setConfManInt }, - { "setConfMan", "(Ljava/lang/String;Ljava/lang/String;)V", - (void *)ScummVM_setConfManString }, - { "enableZoning", "(Z)V", - (void *)ScummVM_enableZoning }, - { "setSurfaceSize", "(II)V", - (void *)ScummVM_setSurfaceSize }, -}; - -JNIEXPORT jint JNICALL -JNI_OnLoad(JavaVM *jvm, void *reserved) { - cached_jvm = jvm; - - JNIEnv *env; - - if (jvm->GetEnv((void **)&env, JNI_VERSION_1_2)) - return JNI_ERR; - - jclass cls = env->FindClass("org/inodes/gus/scummvm/ScummVM"); - if (cls == 0) - return JNI_ERR; - - if (env->RegisterNatives(cls, gMethods, ARRAYSIZE(gMethods)) < 0) - return JNI_ERR; - - FID_ScummVM_nativeScummVM = env->GetFieldID(cls, "nativeScummVM", "J"); - if (FID_ScummVM_nativeScummVM == 0) - return JNI_ERR; +void JNI::setSurfaceSize(JNIEnv *env, jobject self, jint width, jint height) { + assert(_system); - jclass event = env->FindClass("org/inodes/gus/scummvm/Event"); - if (event == 0) - return JNI_ERR; - - FID_Event_type = env->GetFieldID(event, "type", "I"); - if (FID_Event_type == 0) - return JNI_ERR; - - FID_Event_synthetic = env->GetFieldID(event, "synthetic", "Z"); - if (FID_Event_synthetic == 0) - return JNI_ERR; - - FID_Event_kbd_keycode = env->GetFieldID(event, "kbd_keycode", "I"); - if (FID_Event_kbd_keycode == 0) - return JNI_ERR; - - FID_Event_kbd_ascii = env->GetFieldID(event, "kbd_ascii", "I"); - if (FID_Event_kbd_ascii == 0) - return JNI_ERR; - - FID_Event_kbd_flags = env->GetFieldID(event, "kbd_flags", "I"); - if (FID_Event_kbd_flags == 0) - return JNI_ERR; - - FID_Event_mouse_x = env->GetFieldID(event, "mouse_x", "I"); - if (FID_Event_mouse_x == 0) - return JNI_ERR; - - FID_Event_mouse_y = env->GetFieldID(event, "mouse_y", "I"); - if (FID_Event_mouse_y == 0) - return JNI_ERR; - - FID_Event_mouse_relative = env->GetFieldID(event, "mouse_relative", "Z"); - if (FID_Event_mouse_relative == 0) - return JNI_ERR; - - return JNI_VERSION_1_2; + _system->setSurfaceSize(width, height); } #endif -- cgit v1.2.3 From 53b5808d4f16a44779ef5fd8a5c8ca5e262e0379 Mon Sep 17 00:00:00 2001 From: dhewg Date: Thu, 24 Feb 2011 00:45:41 +0100 Subject: ANDROID: Move rest of everything JNI --- backends/platform/android/jni.cpp | 201 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 194 insertions(+), 7 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 4fa08ef7ab..f24a60d48d 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -29,8 +29,8 @@ #include "common/config-manager.h" #include "backends/platform/android/android.h" - -jobject back_ptr; +#include "backends/platform/android/asset-archive.h" +#include "backends/platform/android/jni.h" __attribute__ ((visibility("default"))) jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { @@ -39,6 +39,8 @@ jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { JavaVM *JNI::_vm = 0; jobject JNI::_jobj = 0; + +Common::Archive *JNI::_asset_archive = 0; OSystem_Android *JNI::_system = 0; jfieldID JNI::_FID_Event_type = 0; @@ -51,6 +53,17 @@ jfieldID JNI::_FID_Event_mouse_y = 0; jfieldID JNI::_FID_Event_mouse_relative = 0; jfieldID JNI::_FID_ScummVM_nativeScummVM = 0; +jmethodID JNI::_MID_displayMessageOnOSD = 0; +jmethodID JNI::_MID_setWindowCaption = 0; +jmethodID JNI::_MID_initBackend = 0; +jmethodID JNI::_MID_audioSampleRate = 0; +jmethodID JNI::_MID_showVirtualKeyboard = 0; +jmethodID JNI::_MID_getSysArchives = 0; +jmethodID JNI::_MID_getPluginDirectories = 0; +jmethodID JNI::_MID_setupScummVMSurface = 0; +jmethodID JNI::_MID_destroyScummVMSurface = 0; +jmethodID JNI::_MID_swapBuffers = 0; + const JNINativeMethod JNI::_natives[] = { { "create", "(Landroid/content/res/AssetManager;)V", (void *)JNI::create }, @@ -179,21 +192,192 @@ void JNI::throwByName(JNIEnv *env, const char *name, const char *msg) { env->DeleteLocalRef(cls); } +// calls to the dark side + +int JNI::getAudioSampleRate() { + JNIEnv *env = JNI::getEnv(); + + jint sample_rate = env->CallIntMethod(_jobj, _MID_audioSampleRate); + + if (env->ExceptionCheck()) { + warning("Error finding audio sample rate - assuming 11025HZ"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + + return 11025; + } + + return sample_rate; +} + +void JNI::initBackend() { + JNIEnv *env = JNI::getEnv(); + + env->CallVoidMethod(_jobj, _MID_initBackend); + + if (env->ExceptionCheck()) { + error("Error in Java initBackend"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + + // TODO now what? + } +} + +void JNI::getPluginDirectories(Common::FSList &dirs) { + JNIEnv *env = JNI::getEnv(); + + jobjectArray array = + (jobjectArray)env->CallObjectMethod(_jobj, _MID_getPluginDirectories); + + if (env->ExceptionCheck()) { + warning("Error finding plugin directories"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + + return; + } + + jsize size = env->GetArrayLength(array); + for (jsize i = 0; i < size; ++i) { + jstring path_obj = (jstring)env->GetObjectArrayElement(array, i); + + if (path_obj == 0) + continue; + + const char *path = env->GetStringUTFChars(path_obj, 0); + + if (path == 0) { + warning("Error getting string characters from plugin directory"); + + env->ExceptionClear(); + env->DeleteLocalRef(path_obj); + + continue; + } + + dirs.push_back(Common::FSNode(path)); + + env->ReleaseStringUTFChars(path_obj, path); + env->DeleteLocalRef(path_obj); + } +} + +void JNI::setWindowCaption(const char *caption) { + JNIEnv *env = JNI::getEnv(); + jstring java_caption = env->NewStringUTF(caption); + + env->CallVoidMethod(_jobj, _MID_setWindowCaption, java_caption); + + if (env->ExceptionCheck()) { + warning("Failed to set window caption"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } + + env->DeleteLocalRef(java_caption); +} + +void JNI::displayMessageOnOSD(const char *msg) { + JNIEnv *env = JNI::getEnv(); + jstring java_msg = env->NewStringUTF(msg); + + env->CallVoidMethod(_jobj, _MID_displayMessageOnOSD, java_msg); + + if (env->ExceptionCheck()) { + warning("Failed to display OSD message"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } + + env->DeleteLocalRef(java_msg); +} + +void JNI::showVirtualKeyboard(bool enable) { + JNIEnv *env = JNI::getEnv(); + + env->CallVoidMethod(_jobj, _MID_showVirtualKeyboard, enable); + + if (env->ExceptionCheck()) { + error("Error trying to show virtual keyboard"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + +void JNI::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { + JNIEnv *env = JNI::getEnv(); + + s.add("ASSET", _asset_archive, priority, false); + + jobjectArray array = + (jobjectArray)env->CallObjectMethod(_jobj, _MID_getSysArchives); + + if (env->ExceptionCheck()) { + warning("Error finding system archive path"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + + return; + } + + jsize size = env->GetArrayLength(array); + for (jsize i = 0; i < size; ++i) { + jstring path_obj = (jstring)env->GetObjectArrayElement(array, i); + const char *path = env->GetStringUTFChars(path_obj, 0); + + if (path != 0) { + s.addDirectory(path, path, priority); + env->ReleaseStringUTFChars(path_obj, path); + } + + env->DeleteLocalRef(path_obj); + } +} + +// natives for the dark side + void JNI::create(JNIEnv *env, jobject self, jobject am) { assert(!_system); - _system = new OSystem_Android(am); + _asset_archive = new AndroidAssetArchive(am); + assert(_asset_archive); + + _system = new OSystem_Android(); assert(_system); // weak global ref to allow class to be unloaded // ... except dalvik implements NewWeakGlobalRef only on froyo //_jobj = env->NewWeakGlobalRef(self); _jobj = env->NewGlobalRef(self); - back_ptr = _jobj; - // Exception already thrown by initJavaHooks? - if (!_system->initJavaHooks(env)) - return; + jclass cls = env->GetObjectClass(_jobj); + +#define FIND_METHOD(name, signature) do { \ + _MID_ ## name = env->GetMethodID(cls, #name, signature); \ + if (_MID_ ## name == 0) \ + return; \ + } while (0) + + FIND_METHOD(setWindowCaption, "(Ljava/lang/String;)V"); + FIND_METHOD(displayMessageOnOSD, "(Ljava/lang/String;)V"); + FIND_METHOD(initBackend, "()V"); + FIND_METHOD(audioSampleRate, "()I"); + FIND_METHOD(showVirtualKeyboard, "(Z)V"); + FIND_METHOD(getSysArchives, "()[Ljava/lang/String;"); + FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;"); + FIND_METHOD(setupScummVMSurface, "()V"); + FIND_METHOD(destroyScummVMSurface, "()V"); + FIND_METHOD(swapBuffers, "()Z"); + +#undef FIND_METHOD env->SetLongField(self, _FID_ScummVM_nativeScummVM, (jlong)_system); @@ -208,6 +392,9 @@ void JNI::destroy(JNIEnv *env, jobject self) { _system = 0; delete tmp; + delete _asset_archive; + _asset_archive = 0; + // see above //JNI::getEnv()->DeleteWeakGlobalRef(_jobj); JNI::getEnv()->DeleteGlobalRef(_jobj); -- cgit v1.2.3 From 25d895b859af0df8ea6daa85ba6ec5a0acb81f9d Mon Sep 17 00:00:00 2001 From: dhewg Date: Sat, 26 Feb 2011 14:53:02 +0100 Subject: ANDROID: Rework audio system Move the audio thread to the bright side --- backends/platform/android/jni.cpp | 111 +++++++++++++++++++++++--------------- 1 file changed, 68 insertions(+), 43 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index f24a60d48d..5e11203db8 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -39,6 +39,7 @@ jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { JavaVM *JNI::_vm = 0; jobject JNI::_jobj = 0; +jobject JNI::_jobj_audio_track = 0; Common::Archive *JNI::_asset_archive = 0; OSystem_Android *JNI::_system = 0; @@ -56,7 +57,6 @@ jfieldID JNI::_FID_ScummVM_nativeScummVM = 0; jmethodID JNI::_MID_displayMessageOnOSD = 0; jmethodID JNI::_MID_setWindowCaption = 0; jmethodID JNI::_MID_initBackend = 0; -jmethodID JNI::_MID_audioSampleRate = 0; jmethodID JNI::_MID_showVirtualKeyboard = 0; jmethodID JNI::_MID_getSysArchives = 0; jmethodID JNI::_MID_getPluginDirectories = 0; @@ -64,8 +64,14 @@ jmethodID JNI::_MID_setupScummVMSurface = 0; jmethodID JNI::_MID_destroyScummVMSurface = 0; jmethodID JNI::_MID_swapBuffers = 0; +jmethodID JNI::_MID_AudioTrack_pause = 0; +jmethodID JNI::_MID_AudioTrack_play = 0; +jmethodID JNI::_MID_AudioTrack_stop = 0; +jmethodID JNI::_MID_AudioTrack_write = 0; + const JNINativeMethod JNI::_natives[] = { - { "create", "(Landroid/content/res/AssetManager;)V", + { "create", "(Landroid/content/res/AssetManager;" + "Landroid/media/AudioTrack;II)V", (void *)JNI::create }, { "nativeDestroy", "()V", (void *)JNI::destroy }, @@ -73,8 +79,6 @@ const JNINativeMethod JNI::_natives[] = { (void *)JNI::main }, { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", (void *)JNI::pushEvent }, - { "audioMixCallback", "([B)V", - (void *)JNI::audioMixCallback }, { "setConfMan", "(Ljava/lang/String;I)V", (void *)JNI::setConfManInt }, { "setConfMan", "(Ljava/lang/String;Ljava/lang/String;)V", @@ -194,23 +198,6 @@ void JNI::throwByName(JNIEnv *env, const char *name, const char *msg) { // calls to the dark side -int JNI::getAudioSampleRate() { - JNIEnv *env = JNI::getEnv(); - - jint sample_rate = env->CallIntMethod(_jobj, _MID_audioSampleRate); - - if (env->ExceptionCheck()) { - warning("Error finding audio sample rate - assuming 11025HZ"); - - env->ExceptionDescribe(); - env->ExceptionClear(); - - return 11025; - } - - return sample_rate; -} - void JNI::initBackend() { JNIEnv *env = JNI::getEnv(); @@ -342,15 +329,55 @@ void JNI::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { } } +void JNI::setAudioPause() { + JNIEnv *env = JNI::getEnv(); + + env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_pause); + + if (env->ExceptionCheck()) { + warning("Error setting AudioTrack: pause"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + +void JNI::setAudioPlay() { + JNIEnv *env = JNI::getEnv(); + + env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_play); + + if (env->ExceptionCheck()) { + warning("Error setting AudioTrack: play"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + +void JNI::setAudioStop() { + JNIEnv *env = JNI::getEnv(); + + env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_stop); + + if (env->ExceptionCheck()) { + warning("Error setting AudioTrack: stop"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + // natives for the dark side -void JNI::create(JNIEnv *env, jobject self, jobject am) { +void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, + jint audio_sample_rate, jint audio_buffer_size) { assert(!_system); _asset_archive = new AndroidAssetArchive(am); assert(_asset_archive); - _system = new OSystem_Android(); + _system = new OSystem_Android(audio_sample_rate, audio_buffer_size); assert(_system); // weak global ref to allow class to be unloaded @@ -369,7 +396,6 @@ void JNI::create(JNIEnv *env, jobject self, jobject am) { FIND_METHOD(setWindowCaption, "(Ljava/lang/String;)V"); FIND_METHOD(displayMessageOnOSD, "(Ljava/lang/String;)V"); FIND_METHOD(initBackend, "()V"); - FIND_METHOD(audioSampleRate, "()I"); FIND_METHOD(showVirtualKeyboard, "(Z)V"); FIND_METHOD(getSysArchives, "()[Ljava/lang/String;"); FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;"); @@ -381,6 +407,23 @@ void JNI::create(JNIEnv *env, jobject self, jobject am) { env->SetLongField(self, _FID_ScummVM_nativeScummVM, (jlong)_system); + _jobj_audio_track = env->NewGlobalRef(at); + + cls = env->GetObjectClass(_jobj_audio_track); + +#define FIND_METHOD(name, signature) do { \ + _MID_AudioTrack_ ## name = env->GetMethodID(cls, #name, signature); \ + if (_MID_AudioTrack_ ## name == 0) \ + return; \ + } while (0) + + FIND_METHOD(pause, "()V"); + FIND_METHOD(play, "()V"); + FIND_METHOD(stop, "()V"); + FIND_METHOD(write, "([BII)I"); + +#undef FIND_METHOD + g_system = _system; } @@ -397,6 +440,7 @@ void JNI::destroy(JNIEnv *env, jobject self) { // see above //JNI::getEnv()->DeleteWeakGlobalRef(_jobj); + JNI::getEnv()->DeleteGlobalRef(_jobj_audio_track); JNI::getEnv()->DeleteGlobalRef(_jobj); } @@ -514,25 +558,6 @@ void JNI::pushEvent(JNIEnv *env, jobject self, jobject java_event) { _system->pushEvent(event); } -void JNI::audioMixCallback(JNIEnv *env, jobject self, jbyteArray jbuf) { - assert(_system); - - jsize len = env->GetArrayLength(jbuf); - jbyte *buf = env->GetByteArrayElements(jbuf, 0); - - if (buf == 0) { - warning("Unable to get Java audio byte array. Skipping"); - return; - } - - Audio::MixerImpl *mixer = - static_cast(_system->getMixer()); - assert(mixer); - mixer->mixCallback(reinterpret_cast(buf), len); - - env->ReleaseByteArrayElements(jbuf, buf, 0); -} - void JNI::setConfManInt(JNIEnv *env, jclass cls, jstring key_obj, jint value) { ENTER("%p, %d", key_obj, (int)value); -- cgit v1.2.3 From 0e869a5cf0e455f7cd5ce5c39192f3433b931e97 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sat, 26 Feb 2011 18:44:17 +0100 Subject: ANDROID: Pause the AudioTrack when possible Only works in situations without any registered channels (or all paused) at the mixer (like on the launcher or GMM). CPU usage before (Galaxy Tab): ~5% scummvm ~15% mediaserver After: ~2% scummvm 0% mediaserver ;) --- backends/platform/android/jni.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 5e11203db8..8964fe63d8 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -64,6 +64,7 @@ jmethodID JNI::_MID_setupScummVMSurface = 0; jmethodID JNI::_MID_destroyScummVMSurface = 0; jmethodID JNI::_MID_swapBuffers = 0; +jmethodID JNI::_MID_AudioTrack_flush = 0; jmethodID JNI::_MID_AudioTrack_pause = 0; jmethodID JNI::_MID_AudioTrack_play = 0; jmethodID JNI::_MID_AudioTrack_stop = 0; @@ -332,6 +333,15 @@ void JNI::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { void JNI::setAudioPause() { JNIEnv *env = JNI::getEnv(); + env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_flush); + + if (env->ExceptionCheck()) { + warning("Error flushing AudioTrack"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } + env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_pause); if (env->ExceptionCheck()) { @@ -417,6 +427,7 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, return; \ } while (0) + FIND_METHOD(flush, "()V"); FIND_METHOD(pause, "()V"); FIND_METHOD(play, "()V"); FIND_METHOD(stop, "()V"); -- cgit v1.2.3 From a73b2ec97279b1ef1562ece18c7905591e6a7cc4 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sat, 26 Feb 2011 23:04:18 +0100 Subject: ANDROID: Remove unnecessary code --- backends/platform/android/jni.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 8964fe63d8..d8203e2a57 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -52,7 +52,6 @@ jfieldID JNI::_FID_Event_kbd_flags = 0; jfieldID JNI::_FID_Event_mouse_x = 0; jfieldID JNI::_FID_Event_mouse_y = 0; jfieldID JNI::_FID_Event_mouse_relative = 0; -jfieldID JNI::_FID_ScummVM_nativeScummVM = 0; jmethodID JNI::_MID_displayMessageOnOSD = 0; jmethodID JNI::_MID_setWindowCaption = 0; @@ -111,10 +110,6 @@ jint JNI::onLoad(JavaVM *vm) { if (env->RegisterNatives(cls, _natives, ARRAYSIZE(_natives)) < 0) return JNI_ERR; - _FID_ScummVM_nativeScummVM = env->GetFieldID(cls, "nativeScummVM", "J"); - if (_FID_ScummVM_nativeScummVM == 0) - return JNI_ERR; - jclass event = env->FindClass("org/inodes/gus/scummvm/Event"); if (event == 0) return JNI_ERR; @@ -415,8 +410,6 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, #undef FIND_METHOD - env->SetLongField(self, _FID_ScummVM_nativeScummVM, (jlong)_system); - _jobj_audio_track = env->NewGlobalRef(at); cls = env->GetObjectClass(_jobj_audio_track); @@ -439,7 +432,8 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, } void JNI::destroy(JNIEnv *env, jobject self) { - assert(_system); + if (!_system) + return; OSystem_Android *tmp = _system; g_system = 0; -- cgit v1.2.3 From 72889ee24fc290ba9353084bbf1e1a3fa47a115c Mon Sep 17 00:00:00 2001 From: dhewg Date: Sun, 27 Feb 2011 11:23:11 +0100 Subject: ANDROID: Remove dead code --- backends/platform/android/jni.cpp | 39 --------------------------------------- 1 file changed, 39 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index d8203e2a57..69d1083320 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -79,10 +79,6 @@ const JNINativeMethod JNI::_natives[] = { (void *)JNI::main }, { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", (void *)JNI::pushEvent }, - { "setConfMan", "(Ljava/lang/String;I)V", - (void *)JNI::setConfManInt }, - { "setConfMan", "(Ljava/lang/String;Ljava/lang/String;)V", - (void *)JNI::setConfManString }, { "enableZoning", "(Z)V", (void *)JNI::enableZoning }, { "setSurfaceSize", "(II)V", @@ -563,41 +559,6 @@ void JNI::pushEvent(JNIEnv *env, jobject self, jobject java_event) { _system->pushEvent(event); } -void JNI::setConfManInt(JNIEnv *env, jclass cls, jstring key_obj, jint value) { - ENTER("%p, %d", key_obj, (int)value); - - const char *key = env->GetStringUTFChars(key_obj, 0); - - if (key == 0) - return; - - ConfMan.setInt(key, value); - - env->ReleaseStringUTFChars(key_obj, key); -} - -void JNI::setConfManString(JNIEnv *env, jclass cls, jstring key_obj, - jstring value_obj) { - ENTER("%p, %p", key_obj, value_obj); - - const char *key = env->GetStringUTFChars(key_obj, 0); - - if (key == 0) - return; - - const char *value = env->GetStringUTFChars(value_obj, 0); - - if (value == 0) { - env->ReleaseStringUTFChars(key_obj, key); - return; - } - - ConfMan.set(key, value); - - env->ReleaseStringUTFChars(value_obj, value); - env->ReleaseStringUTFChars(key_obj, key); -} - void JNI::enableZoning(JNIEnv *env, jobject self, jboolean enable) { assert(_system); -- cgit v1.2.3 From 2f008d0cd6ffa84071fe2f5c343ef19328cc83ae Mon Sep 17 00:00:00 2001 From: dhewg Date: Mon, 28 Feb 2011 19:48:41 +0100 Subject: ANDROID: Don't use warning() in JNI functions --- backends/platform/android/jni.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 69d1083320..99934fb640 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -212,7 +212,7 @@ void JNI::getPluginDirectories(Common::FSList &dirs) { (jobjectArray)env->CallObjectMethod(_jobj, _MID_getPluginDirectories); if (env->ExceptionCheck()) { - warning("Error finding plugin directories"); + LOGE("Error finding plugin directories"); env->ExceptionDescribe(); env->ExceptionClear(); @@ -230,7 +230,7 @@ void JNI::getPluginDirectories(Common::FSList &dirs) { const char *path = env->GetStringUTFChars(path_obj, 0); if (path == 0) { - warning("Error getting string characters from plugin directory"); + LOGE("Error getting string characters from plugin directory"); env->ExceptionClear(); env->DeleteLocalRef(path_obj); @@ -252,7 +252,7 @@ void JNI::setWindowCaption(const char *caption) { env->CallVoidMethod(_jobj, _MID_setWindowCaption, java_caption); if (env->ExceptionCheck()) { - warning("Failed to set window caption"); + LOGE("Failed to set window caption"); env->ExceptionDescribe(); env->ExceptionClear(); @@ -268,7 +268,7 @@ void JNI::displayMessageOnOSD(const char *msg) { env->CallVoidMethod(_jobj, _MID_displayMessageOnOSD, java_msg); if (env->ExceptionCheck()) { - warning("Failed to display OSD message"); + LOGE("Failed to display OSD message"); env->ExceptionDescribe(); env->ExceptionClear(); @@ -283,7 +283,7 @@ void JNI::showVirtualKeyboard(bool enable) { env->CallVoidMethod(_jobj, _MID_showVirtualKeyboard, enable); if (env->ExceptionCheck()) { - error("Error trying to show virtual keyboard"); + LOGE("Error trying to show virtual keyboard"); env->ExceptionDescribe(); env->ExceptionClear(); @@ -299,7 +299,7 @@ void JNI::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { (jobjectArray)env->CallObjectMethod(_jobj, _MID_getSysArchives); if (env->ExceptionCheck()) { - warning("Error finding system archive path"); + LOGE("Error finding system archive path"); env->ExceptionDescribe(); env->ExceptionClear(); @@ -327,7 +327,7 @@ void JNI::setAudioPause() { env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_flush); if (env->ExceptionCheck()) { - warning("Error flushing AudioTrack"); + LOGE("Error flushing AudioTrack"); env->ExceptionDescribe(); env->ExceptionClear(); @@ -336,7 +336,7 @@ void JNI::setAudioPause() { env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_pause); if (env->ExceptionCheck()) { - warning("Error setting AudioTrack: pause"); + LOGE("Error setting AudioTrack: pause"); env->ExceptionDescribe(); env->ExceptionClear(); @@ -349,7 +349,7 @@ void JNI::setAudioPlay() { env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_play); if (env->ExceptionCheck()) { - warning("Error setting AudioTrack: play"); + LOGE("Error setting AudioTrack: play"); env->ExceptionDescribe(); env->ExceptionClear(); @@ -362,7 +362,7 @@ void JNI::setAudioStop() { env->CallVoidMethod(_jobj_audio_track, _MID_AudioTrack_stop); if (env->ExceptionCheck()) { - warning("Error setting AudioTrack: stop"); + LOGE("Error setting AudioTrack: stop"); env->ExceptionDescribe(); env->ExceptionClear(); -- cgit v1.2.3 From 2333a32697cda8f5f73861856889001839f38f25 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sun, 27 Feb 2011 20:13:48 +0100 Subject: ANDROID: Untangle JNI interweaving - make the startup sequence more linear - use SurfaceHolder events - get rid of the surface lock - remove unnecessary JNI calls - make the ScummVM class implement Runnable - cleanup --- backends/platform/android/jni.cpp | 192 +++++++++++++++++++++----------------- 1 file changed, 107 insertions(+), 85 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 99934fb640..28a03d0555 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -44,6 +44,11 @@ jobject JNI::_jobj_audio_track = 0; Common::Archive *JNI::_asset_archive = 0; OSystem_Android *JNI::_system = 0; +int JNI::surface_changeid = 0; +int JNI::egl_surface_width = 0; +int JNI::egl_surface_height = 0; +bool JNI::_ready_for_events = 0; + jfieldID JNI::_FID_Event_type = 0; jfieldID JNI::_FID_Event_synthetic = 0; jfieldID JNI::_FID_Event_kbd_keycode = 0; @@ -55,13 +60,12 @@ jfieldID JNI::_FID_Event_mouse_relative = 0; jmethodID JNI::_MID_displayMessageOnOSD = 0; jmethodID JNI::_MID_setWindowCaption = 0; -jmethodID JNI::_MID_initBackend = 0; jmethodID JNI::_MID_showVirtualKeyboard = 0; jmethodID JNI::_MID_getSysArchives = 0; jmethodID JNI::_MID_getPluginDirectories = 0; -jmethodID JNI::_MID_setupScummVMSurface = 0; -jmethodID JNI::_MID_destroyScummVMSurface = 0; jmethodID JNI::_MID_swapBuffers = 0; +jmethodID JNI::_MID_initSurface = 0; +jmethodID JNI::_MID_deinitSurface = 0; jmethodID JNI::_MID_AudioTrack_flush = 0; jmethodID JNI::_MID_AudioTrack_pause = 0; @@ -73,16 +77,16 @@ const JNINativeMethod JNI::_natives[] = { { "create", "(Landroid/content/res/AssetManager;" "Landroid/media/AudioTrack;II)V", (void *)JNI::create }, - { "nativeDestroy", "()V", + { "destroy", "()V", (void *)JNI::destroy }, - { "scummVMMain", "([Ljava/lang/String;)I", + { "setSurface", "(II)V", + (void *)JNI::setSurface }, + { "main", "([Ljava/lang/String;)I", (void *)JNI::main }, { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", (void *)JNI::pushEvent }, { "enableZoning", "(Z)V", (void *)JNI::enableZoning }, - { "setSurfaceSize", "(II)V", - (void *)JNI::setSurfaceSize }, }; JNI::JNI() { @@ -178,6 +182,10 @@ void JNI::detachThread() { } } +void JNI::setReadyForEvents(bool ready) { + _ready_for_events = ready; +} + void JNI::throwByName(JNIEnv *env, const char *name, const char *msg) { jclass cls = env->FindClass(name); @@ -188,61 +196,26 @@ void JNI::throwByName(JNIEnv *env, const char *name, const char *msg) { env->DeleteLocalRef(cls); } -// calls to the dark side - -void JNI::initBackend() { - JNIEnv *env = JNI::getEnv(); - - env->CallVoidMethod(_jobj, _MID_initBackend); - - if (env->ExceptionCheck()) { - error("Error in Java initBackend"); - - env->ExceptionDescribe(); - env->ExceptionClear(); - - // TODO now what? - } +void JNI::throwRuntimeException(JNIEnv *env, const char *msg) { + throwByName(env, "java/lang/RuntimeException", msg); } -void JNI::getPluginDirectories(Common::FSList &dirs) { +// calls to the dark side + +void JNI::displayMessageOnOSD(const char *msg) { JNIEnv *env = JNI::getEnv(); + jstring java_msg = env->NewStringUTF(msg); - jobjectArray array = - (jobjectArray)env->CallObjectMethod(_jobj, _MID_getPluginDirectories); + env->CallVoidMethod(_jobj, _MID_displayMessageOnOSD, java_msg); if (env->ExceptionCheck()) { - LOGE("Error finding plugin directories"); + LOGE("Failed to display OSD message"); env->ExceptionDescribe(); env->ExceptionClear(); - - return; } - jsize size = env->GetArrayLength(array); - for (jsize i = 0; i < size; ++i) { - jstring path_obj = (jstring)env->GetObjectArrayElement(array, i); - - if (path_obj == 0) - continue; - - const char *path = env->GetStringUTFChars(path_obj, 0); - - if (path == 0) { - LOGE("Error getting string characters from plugin directory"); - - env->ExceptionClear(); - env->DeleteLocalRef(path_obj); - - continue; - } - - dirs.push_back(Common::FSNode(path)); - - env->ReleaseStringUTFChars(path_obj, path); - env->DeleteLocalRef(path_obj); - } + env->DeleteLocalRef(java_msg); } void JNI::setWindowCaption(const char *caption) { @@ -261,22 +234,6 @@ void JNI::setWindowCaption(const char *caption) { env->DeleteLocalRef(java_caption); } -void JNI::displayMessageOnOSD(const char *msg) { - JNIEnv *env = JNI::getEnv(); - jstring java_msg = env->NewStringUTF(msg); - - env->CallVoidMethod(_jobj, _MID_displayMessageOnOSD, java_msg); - - if (env->ExceptionCheck()) { - LOGE("Failed to display OSD message"); - - env->ExceptionDescribe(); - env->ExceptionClear(); - } - - env->DeleteLocalRef(java_msg); -} - void JNI::showVirtualKeyboard(bool enable) { JNIEnv *env = JNI::getEnv(); @@ -321,6 +278,72 @@ void JNI::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { } } +void JNI::getPluginDirectories(Common::FSList &dirs) { + JNIEnv *env = JNI::getEnv(); + + jobjectArray array = + (jobjectArray)env->CallObjectMethod(_jobj, _MID_getPluginDirectories); + + if (env->ExceptionCheck()) { + LOGE("Error finding plugin directories"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + + return; + } + + jsize size = env->GetArrayLength(array); + for (jsize i = 0; i < size; ++i) { + jstring path_obj = (jstring)env->GetObjectArrayElement(array, i); + + if (path_obj == 0) + continue; + + const char *path = env->GetStringUTFChars(path_obj, 0); + + if (path == 0) { + LOGE("Error getting string characters from plugin directory"); + + env->ExceptionClear(); + env->DeleteLocalRef(path_obj); + + continue; + } + + dirs.push_back(Common::FSNode(path)); + + env->ReleaseStringUTFChars(path_obj, path); + env->DeleteLocalRef(path_obj); + } +} + +void JNI::initSurface() { + JNIEnv *env = JNI::getEnv(); + + env->CallVoidMethod(_jobj, _MID_initSurface); + + if (env->ExceptionCheck()) { + LOGE("initSurface failed"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + +void JNI::deinitSurface() { + JNIEnv *env = JNI::getEnv(); + + env->CallVoidMethod(_jobj, _MID_deinitSurface); + + if (env->ExceptionCheck()) { + LOGE("deinitSurface failed"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } +} + void JNI::setAudioPause() { JNIEnv *env = JNI::getEnv(); @@ -396,13 +419,12 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, FIND_METHOD(setWindowCaption, "(Ljava/lang/String;)V"); FIND_METHOD(displayMessageOnOSD, "(Ljava/lang/String;)V"); - FIND_METHOD(initBackend, "()V"); FIND_METHOD(showVirtualKeyboard, "(Z)V"); FIND_METHOD(getSysArchives, "()[Ljava/lang/String;"); FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;"); - FIND_METHOD(setupScummVMSurface, "()V"); - FIND_METHOD(destroyScummVMSurface, "()V"); - FIND_METHOD(swapBuffers, "()Z"); + FIND_METHOD(swapBuffers, "()I"); + FIND_METHOD(initSurface, "()V"); + FIND_METHOD(deinitSurface, "()V"); #undef FIND_METHOD @@ -428,16 +450,12 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, } void JNI::destroy(JNIEnv *env, jobject self) { - if (!_system) - return; + delete _asset_archive; + _asset_archive = 0; - OSystem_Android *tmp = _system; + delete _system; g_system = 0; _system = 0; - delete tmp; - - delete _asset_archive; - _asset_archive = 0; // see above //JNI::getEnv()->DeleteWeakGlobalRef(_jobj); @@ -445,6 +463,12 @@ void JNI::destroy(JNIEnv *env, jobject self) { JNI::getEnv()->DeleteGlobalRef(_jobj); } +void JNI::setSurface(JNIEnv *env, jobject self, jint width, jint height) { + egl_surface_width = width; + egl_surface_height = height; + surface_changeid++; +} + jint JNI::main(JNIEnv *env, jobject self, jobjectArray args) { assert(_system); @@ -489,7 +513,7 @@ jint JNI::main(JNIEnv *env, jobject self, jobjectArray args) { res = scummvm_main(argc, argv); - LOGI("Exiting scummvm_main"); + LOGI("scummvm_main exited with code %d", res); _system->quit(); @@ -514,6 +538,10 @@ cleanup: } void JNI::pushEvent(JNIEnv *env, jobject self, jobject java_event) { + // drop events until we're ready and after we quit + if (!_ready_for_events) + return; + assert(_system); Common::Event event; @@ -565,11 +593,5 @@ void JNI::enableZoning(JNIEnv *env, jobject self, jboolean enable) { _system->enableZoning(enable); } -void JNI::setSurfaceSize(JNIEnv *env, jobject self, jint width, jint height) { - assert(_system); - - _system->setSurfaceSize(width, height); -} - #endif -- cgit v1.2.3 From 82a9beff2b52b2dd3eb7368dd46d8d50cb9f2d9f Mon Sep 17 00:00:00 2001 From: dhewg Date: Wed, 2 Mar 2011 19:38:40 +0100 Subject: ANDROID: Move swapBuffers to the native side --- backends/platform/android/jni.cpp | 54 ++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 9 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 28a03d0555..3c2324dea1 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -40,6 +40,9 @@ jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { JavaVM *JNI::_vm = 0; jobject JNI::_jobj = 0; jobject JNI::_jobj_audio_track = 0; +jobject JNI::_jobj_egl = 0; +jobject JNI::_jobj_egl_display = 0; +jobject JNI::_jobj_egl_surface = 0; Common::Archive *JNI::_asset_archive = 0; OSystem_Android *JNI::_system = 0; @@ -63,10 +66,11 @@ jmethodID JNI::_MID_setWindowCaption = 0; jmethodID JNI::_MID_showVirtualKeyboard = 0; jmethodID JNI::_MID_getSysArchives = 0; jmethodID JNI::_MID_getPluginDirectories = 0; -jmethodID JNI::_MID_swapBuffers = 0; jmethodID JNI::_MID_initSurface = 0; jmethodID JNI::_MID_deinitSurface = 0; +jmethodID JNI::_MID_EGL10_eglSwapBuffers = 0; + jmethodID JNI::_MID_AudioTrack_flush = 0; jmethodID JNI::_MID_AudioTrack_pause = 0; jmethodID JNI::_MID_AudioTrack_play = 0; @@ -75,6 +79,8 @@ jmethodID JNI::_MID_AudioTrack_write = 0; const JNINativeMethod JNI::_natives[] = { { "create", "(Landroid/content/res/AssetManager;" + "Ljavax/microedition/khronos/egl/EGL10;" + "Ljavax/microedition/khronos/egl/EGLDisplay;" "Landroid/media/AudioTrack;II)V", (void *)JNI::create }, { "destroy", "()V", @@ -318,17 +324,23 @@ void JNI::getPluginDirectories(Common::FSList &dirs) { } } -void JNI::initSurface() { +bool JNI::initSurface() { JNIEnv *env = JNI::getEnv(); - env->CallVoidMethod(_jobj, _MID_initSurface); + jobject obj = env->CallObjectMethod(_jobj, _MID_initSurface); - if (env->ExceptionCheck()) { + if (!obj || env->ExceptionCheck()) { LOGE("initSurface failed"); env->ExceptionDescribe(); env->ExceptionClear(); + + return false; } + + _jobj_egl_surface = env->NewGlobalRef(obj); + + return true; } void JNI::deinitSurface() { @@ -342,6 +354,9 @@ void JNI::deinitSurface() { env->ExceptionDescribe(); env->ExceptionClear(); } + + env->DeleteGlobalRef(_jobj_egl_surface); + _jobj_egl_surface = 0; } void JNI::setAudioPause() { @@ -394,11 +409,12 @@ void JNI::setAudioStop() { // natives for the dark side -void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, - jint audio_sample_rate, jint audio_buffer_size) { +void JNI::create(JNIEnv *env, jobject self, jobject asset_manager, + jobject egl, jobject egl_display, + jobject at, jint audio_sample_rate, jint audio_buffer_size) { assert(!_system); - _asset_archive = new AndroidAssetArchive(am); + _asset_archive = new AndroidAssetArchive(asset_manager); assert(_asset_archive); _system = new OSystem_Android(audio_sample_rate, audio_buffer_size); @@ -407,6 +423,7 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, // weak global ref to allow class to be unloaded // ... except dalvik implements NewWeakGlobalRef only on froyo //_jobj = env->NewWeakGlobalRef(self); + _jobj = env->NewGlobalRef(self); jclass cls = env->GetObjectClass(_jobj); @@ -422,10 +439,26 @@ void JNI::create(JNIEnv *env, jobject self, jobject am, jobject at, FIND_METHOD(showVirtualKeyboard, "(Z)V"); FIND_METHOD(getSysArchives, "()[Ljava/lang/String;"); FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;"); - FIND_METHOD(swapBuffers, "()I"); - FIND_METHOD(initSurface, "()V"); + FIND_METHOD(initSurface, "()Ljavax/microedition/khronos/egl/EGLSurface;"); FIND_METHOD(deinitSurface, "()V"); +#undef FIND_METHOD + + _jobj_egl = env->NewGlobalRef(egl); + _jobj_egl_display = env->NewGlobalRef(egl_display); + + cls = env->GetObjectClass(_jobj_egl); + +#define FIND_METHOD(name, signature) do { \ + _MID_EGL10_ ## name = env->GetMethodID(cls, #name, signature); \ + if (_MID_EGL10_ ## name == 0) \ + return; \ + } while (0) + + FIND_METHOD(eglSwapBuffers, "(Ljavax/microedition/khronos/egl/EGLDisplay;" + "Ljavax/microedition/khronos/egl/EGLSurface;" + ")Z"); + #undef FIND_METHOD _jobj_audio_track = env->NewGlobalRef(at); @@ -459,6 +492,9 @@ void JNI::destroy(JNIEnv *env, jobject self) { // see above //JNI::getEnv()->DeleteWeakGlobalRef(_jobj); + + JNI::getEnv()->DeleteGlobalRef(_jobj_egl_display); + JNI::getEnv()->DeleteGlobalRef(_jobj_egl); JNI::getEnv()->DeleteGlobalRef(_jobj_audio_track); JNI::getEnv()->DeleteGlobalRef(_jobj); } -- cgit v1.2.3 From d6e838e1b38a568869ffd655a9bebd225593ffad Mon Sep 17 00:00:00 2001 From: dhewg Date: Wed, 2 Mar 2011 19:45:07 +0100 Subject: ANDROID: Merge FIND_METHODs --- backends/platform/android/jni.cpp | 54 ++++++++++++++------------------------- 1 file changed, 19 insertions(+), 35 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 3c2324dea1..7fe23d0d19 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -428,54 +428,38 @@ void JNI::create(JNIEnv *env, jobject self, jobject asset_manager, jclass cls = env->GetObjectClass(_jobj); -#define FIND_METHOD(name, signature) do { \ - _MID_ ## name = env->GetMethodID(cls, #name, signature); \ - if (_MID_ ## name == 0) \ - return; \ +#define FIND_METHOD(prefix, name, signature) do { \ + _MID_ ## prefix ## name = env->GetMethodID(cls, #name, signature); \ + if (_MID_ ## prefix ## name == 0) \ + return; \ } while (0) - FIND_METHOD(setWindowCaption, "(Ljava/lang/String;)V"); - FIND_METHOD(displayMessageOnOSD, "(Ljava/lang/String;)V"); - FIND_METHOD(showVirtualKeyboard, "(Z)V"); - FIND_METHOD(getSysArchives, "()[Ljava/lang/String;"); - FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;"); - FIND_METHOD(initSurface, "()Ljavax/microedition/khronos/egl/EGLSurface;"); - FIND_METHOD(deinitSurface, "()V"); - -#undef FIND_METHOD + FIND_METHOD(, setWindowCaption, "(Ljava/lang/String;)V"); + FIND_METHOD(, displayMessageOnOSD, "(Ljava/lang/String;)V"); + FIND_METHOD(, showVirtualKeyboard, "(Z)V"); + FIND_METHOD(, getSysArchives, "()[Ljava/lang/String;"); + FIND_METHOD(, getPluginDirectories, "()[Ljava/lang/String;"); + FIND_METHOD(, initSurface, "()Ljavax/microedition/khronos/egl/EGLSurface;"); + FIND_METHOD(, deinitSurface, "()V"); _jobj_egl = env->NewGlobalRef(egl); _jobj_egl_display = env->NewGlobalRef(egl_display); cls = env->GetObjectClass(_jobj_egl); -#define FIND_METHOD(name, signature) do { \ - _MID_EGL10_ ## name = env->GetMethodID(cls, #name, signature); \ - if (_MID_EGL10_ ## name == 0) \ - return; \ - } while (0) - - FIND_METHOD(eglSwapBuffers, "(Ljavax/microedition/khronos/egl/EGLDisplay;" - "Ljavax/microedition/khronos/egl/EGLSurface;" - ")Z"); - -#undef FIND_METHOD + FIND_METHOD(EGL10_, eglSwapBuffers, + "(Ljavax/microedition/khronos/egl/EGLDisplay;" + "Ljavax/microedition/khronos/egl/EGLSurface;)Z"); _jobj_audio_track = env->NewGlobalRef(at); cls = env->GetObjectClass(_jobj_audio_track); -#define FIND_METHOD(name, signature) do { \ - _MID_AudioTrack_ ## name = env->GetMethodID(cls, #name, signature); \ - if (_MID_AudioTrack_ ## name == 0) \ - return; \ - } while (0) - - FIND_METHOD(flush, "()V"); - FIND_METHOD(pause, "()V"); - FIND_METHOD(play, "()V"); - FIND_METHOD(stop, "()V"); - FIND_METHOD(write, "([BII)I"); + FIND_METHOD(AudioTrack_, flush, "()V"); + FIND_METHOD(AudioTrack_, pause, "()V"); + FIND_METHOD(AudioTrack_, play, "()V"); + FIND_METHOD(AudioTrack_, stop, "()V"); + FIND_METHOD(AudioTrack_, write, "([BII)I"); #undef FIND_METHOD -- cgit v1.2.3 From 25ef065a4172443eebdd1031c8a387f30f930ec4 Mon Sep 17 00:00:00 2001 From: dhewg Date: Wed, 2 Mar 2011 20:25:47 +0100 Subject: ANDROID: Implement pause/resume Don't just kill the whole process when the Activity is stopped. Instead, use its events to pause or resume audio and the running engine (if any). Of course not every engines implements that... but at least an incoming call doesn't kill the game now (lol). --- backends/platform/android/jni.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 7fe23d0d19..1e28b065b4 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -27,6 +27,7 @@ #include "base/main.h" #include "common/config-manager.h" +#include "engines/engine.h" #include "backends/platform/android/android.h" #include "backends/platform/android/asset-archive.h" @@ -93,6 +94,8 @@ const JNINativeMethod JNI::_natives[] = { (void *)JNI::pushEvent }, { "enableZoning", "(Z)V", (void *)JNI::enableZoning }, + { "pauseEngine", "(Z)V", + (void *)JNI::pauseEngine } }; JNI::JNI() { @@ -613,5 +616,15 @@ void JNI::enableZoning(JNIEnv *env, jobject self, jboolean enable) { _system->enableZoning(enable); } +void JNI::pauseEngine(JNIEnv *env, jobject self, jboolean pause) { + if (!_system || !g_engine) + return; + + if ((pause && !g_engine->isPaused()) || (!pause && g_engine->isPaused())) { + LOGD("pauseEngine: %d", pause); + g_engine->pauseEngine(pause); + } +} + #endif -- cgit v1.2.3 From c2d4cce429baa56b5a0962a854ece6163270995f Mon Sep 17 00:00:00 2001 From: dhewg Date: Wed, 2 Mar 2011 22:26:15 +0100 Subject: ANDROID: On pause, put all threads in a coma Since not every engine respects pauseEngine(), or they're in a state where it simply gets ignored, put all threads in a group coma. Without this, code still kept looping and wasting cpu cycles, while the user might want to do use her/his droid for something else. --- backends/platform/android/jni.cpp | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 1e28b065b4..9ecd9577e7 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -48,6 +48,9 @@ jobject JNI::_jobj_egl_surface = 0; Common::Archive *JNI::_asset_archive = 0; OSystem_Android *JNI::_system = 0; +bool JNI::pause = false; +sem_t JNI::pause_sem = { 0 }; + int JNI::surface_changeid = 0; int JNI::egl_surface_width = 0; int JNI::egl_surface_height = 0; @@ -417,6 +420,10 @@ void JNI::create(JNIEnv *env, jobject self, jobject asset_manager, jobject at, jint audio_sample_rate, jint audio_buffer_size) { assert(!_system); + pause = false; + // initial value of zero! + sem_init(&pause_sem, 0, 0); + _asset_archive = new AndroidAssetArchive(asset_manager); assert(_asset_archive); @@ -477,6 +484,8 @@ void JNI::destroy(JNIEnv *env, jobject self) { g_system = 0; _system = 0; + sem_destroy(&pause_sem); + // see above //JNI::getEnv()->DeleteWeakGlobalRef(_jobj); @@ -616,13 +625,23 @@ void JNI::enableZoning(JNIEnv *env, jobject self, jboolean enable) { _system->enableZoning(enable); } -void JNI::pauseEngine(JNIEnv *env, jobject self, jboolean pause) { - if (!_system || !g_engine) +void JNI::pauseEngine(JNIEnv *env, jobject self, jboolean value) { + if (!_system) return; - if ((pause && !g_engine->isPaused()) || (!pause && g_engine->isPaused())) { - LOGD("pauseEngine: %d", pause); - g_engine->pauseEngine(pause); + if (g_engine) + if ((value && !g_engine->isPaused()) || + (!value && g_engine->isPaused())) { + LOGD("pauseEngine: %d", value); + g_engine->pauseEngine(value); + } + + pause = value; + + if (!pause) { + // wake up all threads + for (uint i = 0; i < 3; ++i) + sem_post(&pause_sem); } } -- cgit v1.2.3 From 719d22918d8058cba68923b4c11b792dbe76f22f Mon Sep 17 00:00:00 2001 From: dhewg Date: Wed, 2 Mar 2011 23:41:59 +0100 Subject: ANDROID: Respect the pause level. --- backends/platform/android/jni.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 9ecd9577e7..175973079f 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -629,12 +629,10 @@ void JNI::pauseEngine(JNIEnv *env, jobject self, jboolean value) { if (!_system) return; - if (g_engine) - if ((value && !g_engine->isPaused()) || - (!value && g_engine->isPaused())) { - LOGD("pauseEngine: %d", value); - g_engine->pauseEngine(value); - } + if (g_engine) { + LOGD("pauseEngine: %d", value); + g_engine->pauseEngine(value); + } pause = value; -- cgit v1.2.3 From 1e3c96b3efaea537dfe82b1d535d1d46cc82a8a0 Mon Sep 17 00:00:00 2001 From: dhewg Date: Thu, 3 Mar 2011 11:20:37 +0100 Subject: ANDROID: Formatting/whitespaces --- backends/platform/android/jni.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 175973079f..e1acabd6d3 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -90,9 +90,9 @@ const JNINativeMethod JNI::_natives[] = { { "destroy", "()V", (void *)JNI::destroy }, { "setSurface", "(II)V", - (void *)JNI::setSurface }, + (void *)JNI::setSurface }, { "main", "([Ljava/lang/String;)I", - (void *)JNI::main }, + (void *)JNI::main }, { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", (void *)JNI::pushEvent }, { "enableZoning", "(Z)V", -- cgit v1.2.3 From a7a7542d1de3f6bb8d076b04cf63a761f01472e1 Mon Sep 17 00:00:00 2001 From: dhewg Date: Thu, 3 Mar 2011 11:35:21 +0100 Subject: ANDROID: Remove an indirection when pausing --- backends/platform/android/jni.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index e1acabd6d3..73b74394c0 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -97,8 +97,8 @@ const JNINativeMethod JNI::_natives[] = { (void *)JNI::pushEvent }, { "enableZoning", "(Z)V", (void *)JNI::enableZoning }, - { "pauseEngine", "(Z)V", - (void *)JNI::pauseEngine } + { "setPause", "(Z)V", + (void *)JNI::setPause } }; JNI::JNI() { @@ -625,7 +625,7 @@ void JNI::enableZoning(JNIEnv *env, jobject self, jboolean enable) { _system->enableZoning(enable); } -void JNI::pauseEngine(JNIEnv *env, jobject self, jboolean value) { +void JNI::setPause(JNIEnv *env, jobject self, jboolean value) { if (!_system) return; -- cgit v1.2.3 From 1f90d232e3b4911f725fe22489aaa2cc2253426d Mon Sep 17 00:00:00 2001 From: dhewg Date: Mon, 7 Mar 2011 19:52:44 +0100 Subject: ANDROID: Save the game when the process is paused The OS can kill the activity at will after onPause() or onStop() to free up memory for other application. Provide a parachute when the engine allows it. --- backends/platform/android/jni.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 73b74394c0..6bfe9c2095 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -631,7 +631,13 @@ void JNI::setPause(JNIEnv *env, jobject self, jboolean value) { if (g_engine) { LOGD("pauseEngine: %d", value); + g_engine->pauseEngine(value); + + if (value && + g_engine->hasFeature(Engine::kSupportsSavingDuringRuntime) && + g_engine->canSaveGameStateCurrently()) + g_engine->saveGameState(0, "Android parachute"); } pause = value; -- cgit v1.2.3 From 79d991081dbeaddd0294c6bbf01675d1ec1fbb72 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sun, 13 Mar 2011 22:31:28 +0100 Subject: ANDROID: Add support for video feature flags kFeatureFullscreenMode and kFeatureAspectRatioCorrection are supported now. The former prevents scaling to the full display - it scales one axis and keeps the game AR. --- backends/platform/android/jni.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 6bfe9c2095..0628d92a2f 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -65,6 +65,7 @@ jfieldID JNI::_FID_Event_mouse_x = 0; jfieldID JNI::_FID_Event_mouse_y = 0; jfieldID JNI::_FID_Event_mouse_relative = 0; +jmethodID JNI::_MID_getDPI = 0; jmethodID JNI::_MID_displayMessageOnOSD = 0; jmethodID JNI::_MID_setWindowCaption = 0; jmethodID JNI::_MID_showVirtualKeyboard = 0; @@ -214,6 +215,35 @@ void JNI::throwRuntimeException(JNIEnv *env, const char *msg) { // calls to the dark side +void JNI::getDPI(float *values) { + values[0] = 0.0; + values[1] = 0.0; + + JNIEnv *env = JNI::getEnv(); + + jfloatArray array = env->NewFloatArray(2); + + env->CallVoidMethod(_jobj, _MID_getDPI, array); + + if (env->ExceptionCheck()) { + LOGE("Failed to get DPIs"); + + env->ExceptionDescribe(); + env->ExceptionClear(); + } else { + jfloat *res = env->GetFloatArrayElements(array, 0); + + if (res) { + values[0] = res[0]; + values[1] = res[1]; + + env->ReleaseFloatArrayElements(array, res, 0); + } + } + + env->DeleteLocalRef(array); +} + void JNI::displayMessageOnOSD(const char *msg) { JNIEnv *env = JNI::getEnv(); jstring java_msg = env->NewStringUTF(msg); @@ -445,6 +475,7 @@ void JNI::create(JNIEnv *env, jobject self, jobject asset_manager, } while (0) FIND_METHOD(, setWindowCaption, "(Ljava/lang/String;)V"); + FIND_METHOD(, getDPI, "([F)V"); FIND_METHOD(, displayMessageOnOSD, "(Ljava/lang/String;)V"); FIND_METHOD(, showVirtualKeyboard, "(Z)V"); FIND_METHOD(, getSysArchives, "()[Ljava/lang/String;"); -- cgit v1.2.3 From adef4c3f4256a690b374b9801279952c39ccf7a4 Mon Sep 17 00:00:00 2001 From: dhewg Date: Tue, 15 Mar 2011 23:30:17 +0100 Subject: ANDROID: Input system overhaul Rewritten input system with many new feature. Fixed related bugs and shortcomings on the way. --- backends/platform/android/jni.cpp | 96 +++------------------------------------ 1 file changed, 7 insertions(+), 89 deletions(-) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 0628d92a2f..92cb04904c 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -56,15 +56,6 @@ int JNI::egl_surface_width = 0; int JNI::egl_surface_height = 0; bool JNI::_ready_for_events = 0; -jfieldID JNI::_FID_Event_type = 0; -jfieldID JNI::_FID_Event_synthetic = 0; -jfieldID JNI::_FID_Event_kbd_keycode = 0; -jfieldID JNI::_FID_Event_kbd_ascii = 0; -jfieldID JNI::_FID_Event_kbd_flags = 0; -jfieldID JNI::_FID_Event_mouse_x = 0; -jfieldID JNI::_FID_Event_mouse_y = 0; -jfieldID JNI::_FID_Event_mouse_relative = 0; - jmethodID JNI::_MID_getDPI = 0; jmethodID JNI::_MID_displayMessageOnOSD = 0; jmethodID JNI::_MID_setWindowCaption = 0; @@ -94,7 +85,7 @@ const JNINativeMethod JNI::_natives[] = { (void *)JNI::setSurface }, { "main", "([Ljava/lang/String;)I", (void *)JNI::main }, - { "pushEvent", "(Lorg/inodes/gus/scummvm/Event;)V", + { "pushEvent", "(IIIIII)V", (void *)JNI::pushEvent }, { "enableZoning", "(Z)V", (void *)JNI::enableZoning }, @@ -123,42 +114,6 @@ jint JNI::onLoad(JavaVM *vm) { if (env->RegisterNatives(cls, _natives, ARRAYSIZE(_natives)) < 0) return JNI_ERR; - jclass event = env->FindClass("org/inodes/gus/scummvm/Event"); - if (event == 0) - return JNI_ERR; - - _FID_Event_type = env->GetFieldID(event, "type", "I"); - if (_FID_Event_type == 0) - return JNI_ERR; - - _FID_Event_synthetic = env->GetFieldID(event, "synthetic", "Z"); - if (_FID_Event_synthetic == 0) - return JNI_ERR; - - _FID_Event_kbd_keycode = env->GetFieldID(event, "kbd_keycode", "I"); - if (_FID_Event_kbd_keycode == 0) - return JNI_ERR; - - _FID_Event_kbd_ascii = env->GetFieldID(event, "kbd_ascii", "I"); - if (_FID_Event_kbd_ascii == 0) - return JNI_ERR; - - _FID_Event_kbd_flags = env->GetFieldID(event, "kbd_flags", "I"); - if (_FID_Event_kbd_flags == 0) - return JNI_ERR; - - _FID_Event_mouse_x = env->GetFieldID(event, "mouse_x", "I"); - if (_FID_Event_mouse_x == 0) - return JNI_ERR; - - _FID_Event_mouse_y = env->GetFieldID(event, "mouse_y", "I"); - if (_FID_Event_mouse_y == 0) - return JNI_ERR; - - _FID_Event_mouse_relative = env->GetFieldID(event, "mouse_relative", "Z"); - if (_FID_Event_mouse_relative == 0) - return JNI_ERR; - return JNI_VERSION_1_2; } @@ -600,54 +555,17 @@ cleanup: return res; } -void JNI::pushEvent(JNIEnv *env, jobject self, jobject java_event) { +void JNI::pushEvent(JNIEnv *env, jobject self, int type, int arg1, int arg2, + int arg3, int arg4, int arg5) { // drop events until we're ready and after we quit - if (!_ready_for_events) + if (!_ready_for_events) { + LOGW("dropping event"); return; + } assert(_system); - Common::Event event; - event.type = (Common::EventType)env->GetIntField(java_event, - _FID_Event_type); - - event.synthetic = - env->GetBooleanField(java_event, _FID_Event_synthetic); - - switch (event.type) { - case Common::EVENT_KEYDOWN: - case Common::EVENT_KEYUP: - event.kbd.keycode = (Common::KeyCode)env->GetIntField( - java_event, _FID_Event_kbd_keycode); - event.kbd.ascii = static_cast(env->GetIntField( - java_event, _FID_Event_kbd_ascii)); - event.kbd.flags = static_cast(env->GetIntField( - java_event, _FID_Event_kbd_flags)); - break; - case Common::EVENT_MOUSEMOVE: - case Common::EVENT_LBUTTONDOWN: - case Common::EVENT_LBUTTONUP: - case Common::EVENT_RBUTTONDOWN: - case Common::EVENT_RBUTTONUP: - case Common::EVENT_WHEELUP: - case Common::EVENT_WHEELDOWN: - case Common::EVENT_MBUTTONDOWN: - case Common::EVENT_MBUTTONUP: - event.mouse.x = - env->GetIntField(java_event, _FID_Event_mouse_x); - event.mouse.y = - env->GetIntField(java_event, _FID_Event_mouse_y); - // This is a terrible hack. We stash "relativeness" - // in the kbd.flags field until pollEvent() can work - // it out. - event.kbd.flags = env->GetBooleanField( - java_event, _FID_Event_mouse_relative) ? 1 : 0; - break; - default: - break; - } - - _system->pushEvent(event); + _system->pushEvent(type, arg1, arg2, arg3, arg4, arg5); } void JNI::enableZoning(JNIEnv *env, jobject self, jboolean enable) { -- cgit v1.2.3 From 801f576f9c36025068d13cb852082e5fc9d21e87 Mon Sep 17 00:00:00 2001 From: dhewg Date: Sun, 3 Apr 2011 16:39:00 +0200 Subject: ANDROID: Log the ScummVM version --- backends/platform/android/jni.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 92cb04904c..08a1491998 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -26,6 +26,7 @@ #if defined(__ANDROID__) #include "base/main.h" +#include "base/version.h" #include "common/config-manager.h" #include "engines/engine.h" @@ -403,6 +404,8 @@ void JNI::setAudioStop() { void JNI::create(JNIEnv *env, jobject self, jobject asset_manager, jobject egl, jobject egl_display, jobject at, jint audio_sample_rate, jint audio_buffer_size) { + LOGI(gScummVMFullVersion); + assert(!_system); pause = false; -- cgit v1.2.3 From 1b681e85a8a0345d0ce848a7584a7654ad629f07 Mon Sep 17 00:00:00 2001 From: Ori Avtalion Date: Thu, 28 Apr 2011 20:05:01 +0300 Subject: ANDROID: Fix compilation --- backends/platform/android/jni.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 08a1491998..7962fa7b4b 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -28,6 +28,7 @@ #include "base/main.h" #include "base/version.h" #include "common/config-manager.h" +#include "common/textconsole.h" #include "engines/engine.h" #include "backends/platform/android/android.h" -- cgit v1.2.3 From 52c0b2e28c85658d0ae2d2522e6e2d02c4db8796 Mon Sep 17 00:00:00 2001 From: Ori Avtalion Date: Thu, 28 Apr 2011 20:53:01 +0300 Subject: ANDROID: Another attempt at compilation fix --- backends/platform/android/jni.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index 7962fa7b4b..f23d71b2a4 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -28,6 +28,7 @@ #include "base/main.h" #include "base/version.h" #include "common/config-manager.h" +#include "common/error.h" #include "common/textconsole.h" #include "engines/engine.h" -- cgit v1.2.3 From a50c36d1381be2e7d0748a2c734e41357fd4920f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 3 May 2011 14:29:01 +0200 Subject: ANDROID: Fix various forbidden symbol clashes --- backends/platform/android/jni.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'backends/platform/android/jni.cpp') diff --git a/backends/platform/android/jni.cpp b/backends/platform/android/jni.cpp index f23d71b2a4..13aef11fa2 100644 --- a/backends/platform/android/jni.cpp +++ b/backends/platform/android/jni.cpp @@ -25,6 +25,23 @@ #if defined(__ANDROID__) +// Allow use of stuff in +#define FORBIDDEN_SYMBOL_EXCEPTION_time_h + +// Disable printf override in common/forbidden.h to avoid +// clashes with log.h from the Android SDK. +// That header file uses +// __attribute__ ((format(printf, 3, 4))) +// which gets messed up by our override mechanism; this could +// be avoided by either changing the Android SDK to use the equally +// legal and valid +// __attribute__ ((format(printf, 3, 4))) +// or by refining our printf override to use a varadic macro +// (which then wouldn't be portable, though). +// Anyway, for now we just disable the printf override globally +// for the Android port +#define FORBIDDEN_SYMBOL_EXCEPTION_printf + #include "base/main.h" #include "base/version.h" #include "common/config-manager.h" -- cgit v1.2.3