ANDROID: Move the global back reference to jni.cpp
This commit is contained in:
parent
4af28f96ab
commit
c4706733d4
4 changed files with 29 additions and 28 deletions
|
@ -101,7 +101,6 @@ static inline T scalef(T in, float numerator, float denominator) {
|
|||
OSystem_Android *g_sys = 0;
|
||||
|
||||
OSystem_Android::OSystem_Android(jobject am) :
|
||||
_back_ptr(0),
|
||||
_screen_changeid(0),
|
||||
_force_redraw(false),
|
||||
_game_texture(0),
|
||||
|
@ -129,11 +128,6 @@ OSystem_Android::~OSystem_Android() {
|
|||
|
||||
destroyScummVMSurface();
|
||||
|
||||
JNIEnv *env = JNU_GetEnv();
|
||||
// see below
|
||||
//env->DeleteWeakGlobalRef(_back_ptr);
|
||||
env->DeleteGlobalRef(_back_ptr);
|
||||
|
||||
delete _savefile;
|
||||
delete _mixer;
|
||||
delete _timer;
|
||||
|
@ -143,13 +137,8 @@ OSystem_Android::~OSystem_Android() {
|
|||
deleteMutex(_event_queue_lock);
|
||||
}
|
||||
|
||||
bool OSystem_Android::initJavaHooks(JNIEnv *env, jobject self) {
|
||||
// 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);
|
||||
|
||||
jclass cls = env->GetObjectClass(_back_ptr);
|
||||
bool OSystem_Android::initJavaHooks(JNIEnv *env) {
|
||||
jclass cls = env->GetObjectClass(back_ptr);
|
||||
|
||||
#define FIND_METHOD(name, signature) do { \
|
||||
MID_ ## name = env->GetMethodID(cls, #name, signature); \
|
||||
|
@ -213,7 +202,7 @@ void OSystem_Android::initBackend() {
|
|||
|
||||
gettimeofday(&_startTime, 0);
|
||||
|
||||
jint sample_rate = env->CallIntMethod(_back_ptr, MID_audioSampleRate);
|
||||
jint sample_rate = env->CallIntMethod(back_ptr, MID_audioSampleRate);
|
||||
if (env->ExceptionCheck()) {
|
||||
warning("Error finding audio sample rate - assuming 11025HZ");
|
||||
|
||||
|
@ -226,7 +215,7 @@ void OSystem_Android::initBackend() {
|
|||
_mixer = new Audio::MixerImpl(this, sample_rate);
|
||||
_mixer->setReady(true);
|
||||
|
||||
env->CallVoidMethod(_back_ptr, MID_initBackend);
|
||||
env->CallVoidMethod(back_ptr, MID_initBackend);
|
||||
|
||||
if (env->ExceptionCheck()) {
|
||||
error("Error in Java initBackend");
|
||||
|
@ -249,7 +238,7 @@ void OSystem_Android::addPluginDirectories(Common::FSList &dirs) const {
|
|||
JNIEnv *env = JNU_GetEnv();
|
||||
|
||||
jobjectArray array =
|
||||
(jobjectArray)env->CallObjectMethod(_back_ptr, MID_getPluginDirectories);
|
||||
(jobjectArray)env->CallObjectMethod(back_ptr, MID_getPluginDirectories);
|
||||
if (env->ExceptionCheck()) {
|
||||
warning("Error finding plugin directories");
|
||||
|
||||
|
@ -490,7 +479,7 @@ void OSystem_Android::setWindowCaption(const char *caption) {
|
|||
|
||||
JNIEnv *env = JNU_GetEnv();
|
||||
jstring java_caption = env->NewStringUTF(caption);
|
||||
env->CallVoidMethod(_back_ptr, MID_setWindowCaption, java_caption);
|
||||
env->CallVoidMethod(back_ptr, MID_setWindowCaption, java_caption);
|
||||
|
||||
if (env->ExceptionCheck()) {
|
||||
warning("Failed to set window caption");
|
||||
|
@ -508,7 +497,7 @@ void OSystem_Android::displayMessageOnOSD(const char *msg) {
|
|||
JNIEnv *env = JNU_GetEnv();
|
||||
jstring java_msg = env->NewStringUTF(msg);
|
||||
|
||||
env->CallVoidMethod(_back_ptr, MID_displayMessageOnOSD, java_msg);
|
||||
env->CallVoidMethod(back_ptr, MID_displayMessageOnOSD, java_msg);
|
||||
|
||||
if (env->ExceptionCheck()) {
|
||||
warning("Failed to display OSD message");
|
||||
|
@ -525,7 +514,7 @@ void OSystem_Android::showVirtualKeyboard(bool enable) {
|
|||
|
||||
JNIEnv *env = JNU_GetEnv();
|
||||
|
||||
env->CallVoidMethod(_back_ptr, MID_showVirtualKeyboard, enable);
|
||||
env->CallVoidMethod(back_ptr, MID_showVirtualKeyboard, enable);
|
||||
|
||||
if (env->ExceptionCheck()) {
|
||||
error("Error trying to show virtual keyboard");
|
||||
|
@ -574,7 +563,7 @@ void OSystem_Android::addSysArchivesToSearchSet(Common::SearchSet &s,
|
|||
JNIEnv *env = JNU_GetEnv();
|
||||
|
||||
jobjectArray array =
|
||||
(jobjectArray)env->CallObjectMethod(_back_ptr, MID_getSysArchives);
|
||||
(jobjectArray)env->CallObjectMethod(back_ptr, MID_getSysArchives);
|
||||
|
||||
if (env->ExceptionCheck()) {
|
||||
warning("Error finding system archive path");
|
||||
|
|
|
@ -78,6 +78,9 @@ extern void checkGlError(const char *expr, const char *file, int line);
|
|||
#define GLCALL(x) do { (x); } while (false)
|
||||
#endif
|
||||
|
||||
// back pointer to (java) peer instance
|
||||
extern jobject back_ptr;
|
||||
|
||||
extern JNIEnv *JNU_GetEnv();
|
||||
extern void JNU_AttachThread();
|
||||
extern void JNU_DetachThread();
|
||||
|
@ -94,9 +97,6 @@ protected:
|
|||
|
||||
class OSystem_Android : public BaseBackend, public PaletteManager {
|
||||
private:
|
||||
// back pointer to (java) peer instance
|
||||
jobject _back_ptr;
|
||||
|
||||
jmethodID MID_displayMessageOnOSD;
|
||||
jmethodID MID_setWindowCaption;
|
||||
jmethodID MID_initBackend;
|
||||
|
@ -155,7 +155,7 @@ private:
|
|||
public:
|
||||
OSystem_Android(jobject am);
|
||||
virtual ~OSystem_Android();
|
||||
bool initJavaHooks(JNIEnv *env, jobject self);
|
||||
bool initJavaHooks(JNIEnv *env);
|
||||
|
||||
virtual void initBackend();
|
||||
void addPluginDirectories(Common::FSList &dirs) const;
|
||||
|
|
|
@ -63,7 +63,7 @@ void OSystem_Android::setupScummVMSurface() {
|
|||
ENTER();
|
||||
|
||||
JNIEnv *env = JNU_GetEnv();
|
||||
env->CallVoidMethod(_back_ptr, MID_setupScummVMSurface);
|
||||
env->CallVoidMethod(back_ptr, MID_setupScummVMSurface);
|
||||
|
||||
if (env->ExceptionCheck())
|
||||
return;
|
||||
|
@ -117,7 +117,7 @@ void OSystem_Android::setupScummVMSurface() {
|
|||
|
||||
void OSystem_Android::destroyScummVMSurface() {
|
||||
JNIEnv *env = JNU_GetEnv();
|
||||
env->CallVoidMethod(_back_ptr, MID_destroyScummVMSurface);
|
||||
env->CallVoidMethod(back_ptr, MID_destroyScummVMSurface);
|
||||
// Can't use OpenGLES functions after this
|
||||
}
|
||||
|
||||
|
@ -262,7 +262,7 @@ void OSystem_Android::updateScreen() {
|
|||
GLCALL(glPopMatrix());
|
||||
|
||||
JNIEnv *env = JNU_GetEnv();
|
||||
if (!env->CallBooleanMethod(_back_ptr, MID_swapBuffers)) {
|
||||
if (!env->CallBooleanMethod(back_ptr, MID_swapBuffers)) {
|
||||
// Context lost -> need to reinit GL
|
||||
destroyScummVMSurface();
|
||||
setupScummVMSurface();
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue