| /* |
| * Copyright (C) 2013 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "stream_wrapper.h" |
| |
| const int32_t StreamWrapper::END_OF_STREAM = -1; |
| const int32_t StreamWrapper::DEFAULT_BUFFER_SIZE = 1 << 16; // 64Kb |
| |
| StreamWrapper::StreamWrapper() : mEnv(NULL), |
| mStream(NULL), |
| mByteArray(NULL), |
| mBytes(NULL), |
| mByteArrayLen(0) {} |
| |
| StreamWrapper::~StreamWrapper() { |
| cleanup(); |
| } |
| |
| void StreamWrapper::updateEnv(JNIEnv *env) { |
| if (env == NULL) { |
| LOGE("Cannot update StreamWrapper with a null JNIEnv pointer!"); |
| return; |
| } |
| mEnv = env; |
| } |
| |
| bool StreamWrapper::init(JNIEnv *env, jobject stream) { |
| if (mEnv != NULL) { |
| LOGW("StreamWrapper already initialized!"); |
| return false; |
| } |
| mEnv = env; |
| mStream = env->NewGlobalRef(stream); |
| if (mStream == NULL || env->ExceptionCheck()) { |
| cleanup(); |
| return false; |
| } |
| mByteArrayLen = DEFAULT_BUFFER_SIZE; |
| jbyteArray tmp = env->NewByteArray(getBufferSize()); |
| if (tmp == NULL || env->ExceptionCheck()){ |
| cleanup(); |
| return false; |
| } |
| mByteArray = reinterpret_cast<jbyteArray>(env->NewGlobalRef(tmp)); |
| if (mByteArray == NULL || env->ExceptionCheck()){ |
| cleanup(); |
| return false; |
| } |
| mBytes = env->GetByteArrayElements(mByteArray, NULL); |
| if (mBytes == NULL || env->ExceptionCheck()){ |
| cleanup(); |
| return false; |
| } |
| return true; |
| } |
| |
| void StreamWrapper::cleanup() { |
| if (mEnv != NULL) { |
| if (mStream != NULL) { |
| mEnv->DeleteGlobalRef(mStream); |
| mStream = NULL; |
| } |
| if (mByteArray != NULL) { |
| if (mBytes != NULL) { |
| mEnv->ReleaseByteArrayElements(mByteArray, mBytes, JNI_ABORT); |
| mBytes = NULL; |
| } |
| mEnv->DeleteGlobalRef(mByteArray); |
| mByteArray = NULL; |
| } else { |
| mBytes = NULL; |
| } |
| mByteArrayLen = 0; |
| mEnv = NULL; |
| } |
| } |
| |
| int32_t StreamWrapper::getBufferSize() { |
| return mByteArrayLen; |
| } |
| |
| jbyte* StreamWrapper::getBufferPtr() { |
| return mBytes; |
| } |