ANDROID: Wrap JNI code in a class

This commit is contained in:
dhewg 2011-02-23 22:44:33 +01:00
parent c4706733d4
commit f80d993860
6 changed files with 265 additions and 183 deletions

View file

@ -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

View file

@ -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:

View file

@ -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 ...

View file

@ -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();

View file

@ -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);
}
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;
JavaVM *JNI::_vm = 0;
jobject JNI::_jobj = 0;
OSystem_Android *JNI::_system = 0;
JNIEnv *JNU_GetEnv() {
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;
return JNI_VERSION_1_2;
}
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);
void JNI::setSurfaceSize(JNIEnv *env, jobject self, jint width, jint height) {
assert(_system);
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;
return JNI_VERSION_1_2;
_system->setSurfaceSize(width, height);
}
#endif

View file

@ -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