aboutsummaryrefslogtreecommitdiff
path: root/backends/platform
diff options
context:
space:
mode:
authorAlyssa Milburn2013-05-16 12:55:06 +0200
committerAlyssa Milburn2013-05-16 12:55:06 +0200
commit89d9a624d9f0b4f5ba07259d5f90f7f85f15a0df (patch)
treeb354346e4782ecf1e856d9bb3badb980d47fe2af /backends/platform
parent2743da58542aceb21d2403bdcbd8305a3a1ab52e (diff)
downloadscummvm-rg350-89d9a624d9f0b4f5ba07259d5f90f7f85f15a0df.tar.gz
scummvm-rg350-89d9a624d9f0b4f5ba07259d5f90f7f85f15a0df.tar.bz2
scummvm-rg350-89d9a624d9f0b4f5ba07259d5f90f7f85f15a0df.zip
ANDROID: Delete local JNI references to asset data/classes.
Diffstat (limited to 'backends/platform')
-rw-r--r--backends/platform/android/asset-archive.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/backends/platform/android/asset-archive.cpp b/backends/platform/android/asset-archive.cpp
index 14840de996..f1decfb7fa 100644
--- a/backends/platform/android/asset-archive.cpp
+++ b/backends/platform/android/asset-archive.cpp
@@ -97,7 +97,9 @@ JavaInputStream::JavaInputStream(JNIEnv *env, jobject is) :
{
_input_stream = env->NewGlobalRef(is);
_buflen = 8192;
- _buf = (jbyteArray)env->NewGlobalRef(env->NewByteArray(_buflen));
+ jobject buf = env->NewByteArray(_buflen);
+ _buf = (jbyteArray)env->NewGlobalRef(buf);
+ env->DeleteLocalRef(buf);
jclass cls = env->GetObjectClass(_input_stream);
MID_mark = env->GetMethodID(cls, "mark", "(I)V");
@@ -112,6 +114,7 @@ JavaInputStream::JavaInputStream(JNIEnv *env, jobject is) :
assert(MID_reset);
MID_skip = env->GetMethodID(cls, "skip", "(J)J");
assert(MID_skip);
+ env->DeleteLocalRef(cls);
// Mark start of stream, so we can reset back to it.
// readlimit is set to something bigger than anything we might
@@ -142,7 +145,9 @@ uint32 JavaInputStream::read(void *dataPtr, uint32 dataSize) {
_buflen = dataSize;
env->DeleteGlobalRef(_buf);
- _buf = static_cast<jbyteArray>(env->NewGlobalRef(env->NewByteArray(_buflen)));
+ jobject buf = env->NewByteArray(_buflen);
+ _buf = static_cast<jbyteArray>(env->NewGlobalRef(buf));
+ env->DeleteLocalRef(buf);
}
jint ret = env->CallIntMethod(_input_stream, MID_read, _buf, 0, dataSize);
@@ -290,6 +295,7 @@ AssetFdReadStream::AssetFdReadStream(JNIEnv *env, jobject assetfd) :
jclass cls = env->GetObjectClass(_assetfd);
MID_close = env->GetMethodID(cls, "close", "()V");
assert(MID_close);
+ env->DeleteLocalRef(cls);
jmethodID MID_getStartOffset =
env->GetMethodID(cls, "getStartOffset", "()J");
@@ -311,8 +317,10 @@ AssetFdReadStream::AssetFdReadStream(JNIEnv *env, jobject assetfd) :
jclass fd_cls = env->GetObjectClass(javafd);
jfieldID FID_descriptor = env->GetFieldID(fd_cls, "descriptor", "I");
assert(FID_descriptor);
+ env->DeleteLocalRef(fd_cls);
_fd = env->GetIntField(javafd, FID_descriptor);
+ env->DeleteLocalRef(javafd);
}
AssetFdReadStream::~AssetFdReadStream() {
@@ -382,6 +390,7 @@ AndroidAssetArchive::AndroidAssetArchive(jobject am) {
MID_list = env->GetMethodID(cls, "list",
"(Ljava/lang/String;)[Ljava/lang/String;");
assert(MID_list);
+ env->DeleteLocalRef(cls);
}
AndroidAssetArchive::~AndroidAssetArchive() {
@@ -481,8 +490,10 @@ Common::SeekableReadStream *AndroidAssetArchive::createReadStreamForMember(const
env->ExceptionClear();
else if (afd != 0) {
// success :)
+ Common::SeekableReadStream *stream = new AssetFdReadStream(env, afd);
env->DeleteLocalRef(jpath);
- return new AssetFdReadStream(env, afd);
+ env->DeleteLocalRef(afd);
+ return stream;
}
// ... and fallback to normal open() if that doesn't work
@@ -498,7 +509,10 @@ Common::SeekableReadStream *AndroidAssetArchive::createReadStreamForMember(const
return 0;
}
- return new JavaInputStream(env, is);
+ Common::SeekableReadStream *stream = new JavaInputStream(env, is);
+ env->DeleteLocalRef(jpath);
+ env->DeleteLocalRef(is);
+ return stream;
}
#endif