From a04d19e98bc04c1fa814c14ae5fe5f5a4f24fcb8 Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Fri, 14 Oct 2011 17:29:49 +0100 Subject: [PATCH] * Android's InputStream::skip is apparently buggy, so instead read into a dummy buffer --- include/SDL_rwops.h | 1 - src/core/android/SDL_android.cpp | 20 +++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/include/SDL_rwops.h b/include/SDL_rwops.h index 48824f43e..d260f9599 100644 --- a/include/SDL_rwops.h +++ b/include/SDL_rwops.h @@ -89,7 +89,6 @@ typedef struct SDL_RWops void *fileNameRef; void *inputStream; void *inputStreamRef; - void *skipMethod; void *readableByteChannel; void *readableByteChannelRef; void *readMethod; diff --git a/src/core/android/SDL_android.cpp b/src/core/android/SDL_android.cpp index 2b8da3cb8..08bb2d667 100644 --- a/src/core/android/SDL_android.cpp +++ b/src/core/android/SDL_android.cpp @@ -23,6 +23,8 @@ #include "SDL_android.h" +#include + extern "C" { #include "../../events/SDL_events_c.h" #include "../../video/android/SDL_androidkeyboard.h" @@ -346,11 +348,6 @@ static int Android_JNI_FileOpen(SDL_RWops* ctx) ctx->hidden.androidio.inputStream = inputStream; ctx->hidden.androidio.inputStreamRef = mEnv->NewGlobalRef(inputStream); - // Store .skip id for seeking purposes - mid = mEnv->GetMethodID(mEnv->GetObjectClass(inputStream), - "skip", "(J)J"); - ctx->hidden.androidio.skipMethod = mid; - // Despite all the visible documentation on [Asset]InputStream claiming // that the .available() method is not guaranteed to return the entire file // size, comments in /samples//ApiDemos/src/com/example/ ... @@ -518,16 +515,21 @@ extern "C" long Android_JNI_FileSeek(SDL_RWops* ctx, long offset, int whence) long movement = newPosition - ctx->hidden.androidio.position; jobject inputStream = (jobject)ctx->hidden.androidio.inputStream; - jmethodID skipMethod = (jmethodID)ctx->hidden.androidio.skipMethod; if (movement > 0) { + unsigned char buffer[1024]; + // The easy case where we're seeking forwards while (movement > 0) { - // inputStream.skip(...); - movement -= mEnv->CallLongMethod(inputStream, skipMethod, movement); - if (Android_JNI_ExceptionOccurred()) { + size_t result = Android_JNI_FileRead(ctx, buffer, 1, + std::min(movement, (long)sizeof(buffer))); + + if (result <= 0) { + // Failed to read/skip the required amount, so fail return -1; } + + movement -= result; } } else if (movement < 0) { // We can't seek backwards so we have to reopen the file and seek