ANDROID: Wrap JNI code in a class
This commit is contained in:
parent
c4706733d4
commit
f80d993860
6 changed files with 265 additions and 183 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 ...
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
87
backends/platform/android/jni.h
Normal file
87
backends/platform/android/jni.h
Normal 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
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue