69 lines
1.9 KiB
C++
69 lines
1.9 KiB
C++
/**
|
|
* PANDA 3D SOFTWARE
|
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
*
|
|
* All use of this software is subject to the terms of the revised BSD
|
|
* license. You should have received a copy of this license along
|
|
* with this source code in a file named "LICENSE."
|
|
*
|
|
* @file jni_NativeIStream.cxx
|
|
* @author rdb
|
|
* @date 2013-01-22
|
|
*/
|
|
|
|
#include <jni.h>
|
|
|
|
#include <istream>
|
|
|
|
#if __GNUC__ >= 4
|
|
#define EXPORT_JNI extern "C" __attribute__((visibility("default")))
|
|
#else
|
|
#define EXPORT_JNI extern "C"
|
|
#endif
|
|
|
|
/**
|
|
* Reads a single character from the istream. Should return -1 on EOF.
|
|
*/
|
|
EXPORT_JNI jint
|
|
Java_org_panda3d_android_NativeIStream_nativeGet(JNIEnv *env, jclass clazz, jlong ptr) {
|
|
std::istream *stream = (std::istream *) ptr;
|
|
|
|
int ch = stream->get();
|
|
return stream->good() ? ch : -1;
|
|
}
|
|
|
|
/**
|
|
* Reads an array of bytes from the istream. Returns the actual number of
|
|
* bytes that were read. Should return -1 on EOF.
|
|
*/
|
|
EXPORT_JNI jint
|
|
Java_org_panda3d_android_NativeIStream_nativeRead(JNIEnv *env, jclass clazz, jlong ptr, jbyteArray byte_array, jint offset, jint length) {
|
|
std::istream *stream = (std::istream *) ptr;
|
|
jbyte *buffer = (jbyte *) env->GetPrimitiveArrayCritical(byte_array, NULL);
|
|
if (buffer == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
stream->read((char*) buffer + offset, length);
|
|
env->ReleasePrimitiveArrayCritical(byte_array, buffer, 0);
|
|
|
|
// We have to return -1 on EOF, otherwise it will keep trying to read.
|
|
size_t count = stream->gcount();
|
|
if (count == 0 && stream->eof()) {
|
|
return -1;
|
|
} else {
|
|
return count;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Skips ahead N bytes in the stream. Returns the actual number of skipped
|
|
* bytes.
|
|
*/
|
|
EXPORT_JNI jlong
|
|
Java_org_panda3d_android_NativeIStream_nativeIgnore(JNIEnv *env, jclass clazz, jlong ptr, jlong offset) {
|
|
std::istream *stream = (std::istream *) ptr;
|
|
stream->ignore(offset);
|
|
return stream->gcount();
|
|
}
|