aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/platform/android/android.cpp25
-rw-r--r--backends/platform/android/android.h8
-rw-r--r--backends/platform/android/asset-archive.cpp21
-rw-r--r--backends/platform/android/gfx.cpp6
-rw-r--r--backends/platform/android/jni.cpp301
-rw-r--r--backends/platform/android/jni.h87
6 files changed, 265 insertions, 183 deletions
diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp
index f2c9a7407d..9437bf540c 100644
--- a/backends/platform/android/android.cpp
+++ b/backends/platform/android/android.cpp
@@ -98,8 +98,6 @@ static inline T scalef(T in, float numerator, float denominator) {
return static_cast<float>(in) * numerator / denominator;
}
-OSystem_Android *g_sys = 0;
-
OSystem_Android::OSystem_Android(jobject am) :
_screen_changeid(0),
_force_redraw(false),
@@ -166,7 +164,7 @@ void *OSystem_Android::timerThreadFunc(void *arg) {
OSystem_Android *system = (OSystem_Android *)arg;
DefaultTimerManager *timer = (DefaultTimerManager *)(system->_timer);
- JNU_AttachThread();
+ JNI::attachThread();
struct timespec tv;
tv.tv_sec = 0;
@@ -177,7 +175,7 @@ void *OSystem_Android::timerThreadFunc(void *arg) {
nanosleep(&tv, 0);
}
- JNU_DetachThread();
+ JNI::detachThread();
return 0;
}
@@ -185,7 +183,7 @@ void *OSystem_Android::timerThreadFunc(void *arg) {
void OSystem_Android::initBackend() {
ENTER();
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
ConfMan.setInt("autosave_period", 0);
ConfMan.setInt("FM_medium_quality", true);
@@ -235,10 +233,10 @@ void OSystem_Android::initBackend() {
void OSystem_Android::addPluginDirectories(Common::FSList &dirs) const {
ENTER();
- JNIEnv *env = JNU_GetEnv();
-
+ JNIEnv *env = JNI::getEnv();
jobjectArray array =
(jobjectArray)env->CallObjectMethod(back_ptr, MID_getPluginDirectories);
+
if (env->ExceptionCheck()) {
warning("Error finding plugin directories");
@@ -477,7 +475,7 @@ void OSystem_Android::quit() {
void OSystem_Android::setWindowCaption(const char *caption) {
ENTER("%s", caption);
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
jstring java_caption = env->NewStringUTF(caption);
env->CallVoidMethod(back_ptr, MID_setWindowCaption, java_caption);
@@ -494,9 +492,8 @@ void OSystem_Android::setWindowCaption(const char *caption) {
void OSystem_Android::displayMessageOnOSD(const char *msg) {
ENTER("%s", msg);
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
jstring java_msg = env->NewStringUTF(msg);
-
env->CallVoidMethod(back_ptr, MID_displayMessageOnOSD, java_msg);
if (env->ExceptionCheck()) {
@@ -512,8 +509,7 @@ void OSystem_Android::displayMessageOnOSD(const char *msg) {
void OSystem_Android::showVirtualKeyboard(bool enable) {
ENTER("%d", enable);
- JNIEnv *env = JNU_GetEnv();
-
+ JNIEnv *env = JNI::getEnv();
env->CallVoidMethod(back_ptr, MID_showVirtualKeyboard, enable);
if (env->ExceptionCheck()) {
@@ -560,8 +556,7 @@ void OSystem_Android::addSysArchivesToSearchSet(Common::SearchSet &s,
int priority) {
s.add("ASSET", _asset_archive, priority, false);
- JNIEnv *env = JNU_GetEnv();
-
+ JNIEnv *env = JNI::getEnv();
jobjectArray array =
(jobjectArray)env->CallObjectMethod(back_ptr, MID_getSysArchives);
@@ -606,7 +601,7 @@ void OSystem_Android::logMessage(LogMessageType::Type type, const char *message)
#ifdef DYNAMIC_MODULES
void AndroidPluginProvider::addCustomDirectories(Common::FSList &dirs) const {
- g_sys->addPluginDirectories(dirs);
+ ((OSystem_Android *)g_system)->addPluginDirectories(dirs);
}
#endif
diff --git a/backends/platform/android/android.h b/backends/platform/android/android.h
index da487c5ceb..0ccf57e7c1 100644
--- a/backends/platform/android/android.h
+++ b/backends/platform/android/android.h
@@ -36,6 +36,7 @@
#include "backends/plugins/posix/posix-provider.h"
#include "backends/fs/posix/posix-fs-factory.h"
+#include "backends/platform/android/jni.h"
#include "backends/platform/android/texture.h"
#include <pthread.h>
@@ -81,13 +82,6 @@ extern void checkGlError(const char *expr, const char *file, int line);
// back pointer to (java) peer instance
extern jobject back_ptr;
-extern JNIEnv *JNU_GetEnv();
-extern void JNU_AttachThread();
-extern void JNU_DetachThread();
-
-class OSystem_Android;
-extern OSystem_Android *g_sys;
-
#ifdef DYNAMIC_MODULES
class AndroidPluginProvider : public POSIXPluginProvider {
protected:
diff --git a/backends/platform/android/asset-archive.cpp b/backends/platform/android/asset-archive.cpp
index 71ce25aa72..eb2530823d 100644
--- a/backends/platform/android/asset-archive.cpp
+++ b/backends/platform/android/asset-archive.cpp
@@ -36,10 +36,9 @@
#include "common/archive.h"
#include "common/debug.h"
+#include "backends/platform/android/jni.h"
#include "backends/platform/android/asset-archive.h"
-extern JNIEnv *JNU_GetEnv();
-
// Must match android.content.res.AssetManager.ACCESS_*
const jint ACCESS_UNKNOWN = 0;
const jint ACCESS_RANDOM = 1;
@@ -124,7 +123,7 @@ JavaInputStream::JavaInputStream(JNIEnv *env, jobject is) :
}
JavaInputStream::~JavaInputStream() {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
close(env);
env->DeleteGlobalRef(_buf);
@@ -139,7 +138,7 @@ void JavaInputStream::close(JNIEnv *env) {
}
uint32 JavaInputStream::read(void *dataPtr, uint32 dataSize) {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
if (_buflen < jint(dataSize)) {
_buflen = dataSize;
@@ -171,7 +170,7 @@ uint32 JavaInputStream::read(void *dataPtr, uint32 dataSize) {
}
bool JavaInputStream::seek(int32 offset, int whence) {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
uint32 newpos;
switch (whence) {
@@ -318,7 +317,7 @@ AssetFdReadStream::AssetFdReadStream(JNIEnv *env, jobject assetfd) :
}
AssetFdReadStream::~AssetFdReadStream() {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
env->CallVoidMethod(_assetfd, MID_close);
if (env->ExceptionCheck())
@@ -369,7 +368,7 @@ bool AssetFdReadStream::seek(int32 offset, int whence) {
}
AndroidAssetArchive::AndroidAssetArchive(jobject am) {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
_am = env->NewGlobalRef(am);
jclass cls = env->GetObjectClass(_am);
@@ -387,12 +386,12 @@ AndroidAssetArchive::AndroidAssetArchive(jobject am) {
}
AndroidAssetArchive::~AndroidAssetArchive() {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
env->DeleteGlobalRef(_am);
}
bool AndroidAssetArchive::hasFile(const Common::String &name) {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
jstring path = env->NewStringUTF(name.c_str());
jobject result = env->CallObjectMethod(_am, MID_open, path, ACCESS_UNKNOWN);
if (env->ExceptionCheck()) {
@@ -412,7 +411,7 @@ bool AndroidAssetArchive::hasFile(const Common::String &name) {
}
int AndroidAssetArchive::listMembers(Common::ArchiveMemberList &member_list) {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
Common::List<Common::String> dirlist;
dirlist.push_back("");
@@ -469,7 +468,7 @@ Common::ArchiveMemberPtr AndroidAssetArchive::getMember(const Common::String &na
}
Common::SeekableReadStream *AndroidAssetArchive::createReadStreamForMember(const Common::String &path) const {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
jstring jpath = env->NewStringUTF(path.c_str());
// Try openFd() first ...
diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp
index 2b730385e6..2370958d30 100644
--- a/backends/platform/android/gfx.cpp
+++ b/backends/platform/android/gfx.cpp
@@ -62,7 +62,7 @@ int OSystem_Android::getGraphicsMode() const {
void OSystem_Android::setupScummVMSurface() {
ENTER();
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
env->CallVoidMethod(back_ptr, MID_setupScummVMSurface);
if (env->ExceptionCheck())
@@ -116,7 +116,7 @@ void OSystem_Android::setupScummVMSurface() {
}
void OSystem_Android::destroyScummVMSurface() {
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
env->CallVoidMethod(back_ptr, MID_destroyScummVMSurface);
// Can't use OpenGLES functions after this
}
@@ -261,7 +261,7 @@ void OSystem_Android::updateScreen() {
GLCALL(glPopMatrix());
- JNIEnv *env = JNU_GetEnv();
+ JNIEnv *env = JNI::getEnv();
if (!env->CallBooleanMethod(back_ptr, MID_swapBuffers)) {
// Context lost -> need to reinit GL
destroyScummVMSurface();
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<int>(env->GetIntField(
- java_event, FID_Event_kbd_ascii));
+ java_event, _FID_Event_kbd_ascii));
event.kbd.flags = static_cast<int>(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<Audio::MixerImpl *>(g_sys->getMixer());
+ static_cast<Audio::MixerImpl *>(_system->getMixer());
assert(mixer);
mixer->mixCallback(reinterpret_cast<byte *>(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
diff --git a/backends/platform/android/jni.h b/backends/platform/android/jni.h
new file mode 100644
index 0000000000..39276b9388
--- /dev/null
+++ b/backends/platform/android/jni.h
@@ -0,0 +1,87 @@
+/* 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$
+ *
+ */
+
+#ifndef _ANDROID_JNI_H_
+#define _ANDROID_JNI_H_
+
+#if defined(__ANDROID__)
+
+#include <jni.h>
+
+extern jobject back_ptr;
+
+class OSystem_Android;
+
+class JNI {
+public:
+ static jint onLoad(JavaVM *vm);
+
+ static JNIEnv *getEnv();
+
+ static void attachThread();
+ static void detachThread();
+
+private:
+ JNI();
+ virtual ~JNI();
+
+private:
+ static JavaVM *_vm;
+ // back pointer to (java) peer instance
+ static jobject _jobj;
+ static OSystem_Android *_system;
+
+ 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 const JNINativeMethod _natives[];
+
+ static void throwByName(JNIEnv *env, const char *name, const char *msg);
+
+ // natives for the dark side
+ static void create(JNIEnv *env, jobject self, jobject am);
+ static void destroy(JNIEnv *env, jobject self);
+ static jint main(JNIEnv *env, jobject self, jobjectArray args);
+ static void pushEvent(JNIEnv *env, jobject self, jobject java_event);
+ static void audioMixCallback(JNIEnv *env, jobject self, jbyteArray jbuf);
+ static void setConfManInt(JNIEnv *env, jclass cls, jstring key_obj,
+ jint value);
+ static void setConfManString(JNIEnv *env, jclass cls, jstring key_obj,
+ jstring value_obj);
+ static void enableZoning(JNIEnv *env, jobject self, jboolean enable);
+ static void setSurfaceSize(JNIEnv *env, jobject self, jint width,
+ jint height);
+};
+
+#endif
+#endif
+