Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
* Android's InputStream::skip is apparently buggy, so instead read in…
- Loading branch information
Showing
with
11 additions
and
10 deletions.
-
+0
−1
include/SDL_rwops.h
-
+11
−9
src/core/android/SDL_android.cpp
|
@@ -89,7 +89,6 @@ typedef struct SDL_RWops |
|
|
void *fileNameRef; |
|
|
void *inputStream; |
|
|
void *inputStreamRef; |
|
|
void *skipMethod; |
|
|
void *readableByteChannel; |
|
|
void *readableByteChannelRef; |
|
|
void *readMethod; |
|
|
|
@@ -23,6 +23,8 @@ |
|
|
|
|
|
#include "SDL_android.h" |
|
|
|
|
|
#include <algorithm> |
|
|
|
|
|
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 <sdk>/samples/<ver>/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 |
|
|