1d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber/* 2d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * Copyright 2013, The Android Open Source Project 3d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * 4d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * you may not use this file except in compliance with the License. 6d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * You may obtain a copy of the License at 7d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * 8d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * 10d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * Unless required by applicable law or agreed to in writing, software 11d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * See the License for the specific language governing permissions and 14d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber * limitations under the License. 15d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber */ 16d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 17d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber//#define LOG_NDEBUG 0 18d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#define LOG_TAG "MediaHTTPConnection-JNI" 19d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include <utils/Log.h> 20d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 21d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include <binder/MemoryDealer.h> 22d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include <media/stagefright/foundation/ADebug.h> 23d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include <nativehelper/ScopedLocalRef.h> 24d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 25d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_media_MediaHTTPConnection.h" 26d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_util_Binder.h" 27d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 28d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_runtime/AndroidRuntime.h" 29d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "jni.h" 30d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "JNIHelp.h" 31d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 32d2506a506303ed94fd1991cf986b825b870a67c5Andreas Hubernamespace android { 33d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 34d2506a506303ed94fd1991cf986b825b870a67c5Andreas HuberJMediaHTTPConnection::JMediaHTTPConnection(JNIEnv *env, jobject thiz) 35d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber : mClass(NULL), 36d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mObject(NULL), 37d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mByteArrayObj(NULL) { 38d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jclass clazz = env->GetObjectClass(thiz); 39d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber CHECK(clazz != NULL); 40d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 41d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mClass = (jclass)env->NewGlobalRef(clazz); 42d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mObject = env->NewWeakGlobalRef(thiz); 43d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 44d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mDealer = new MemoryDealer(kBufferSize, "MediaHTTPConnection"); 45d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mMemory = mDealer->allocate(kBufferSize); 46d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 47d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber ScopedLocalRef<jbyteArray> tmp( 48d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber env, env->NewByteArray(JMediaHTTPConnection::kBufferSize)); 49d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 50d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mByteArrayObj = (jbyteArray)env->NewGlobalRef(tmp.get()); 51d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 52d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 53d2506a506303ed94fd1991cf986b825b870a67c5Andreas HuberJMediaHTTPConnection::~JMediaHTTPConnection() { 54d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env = AndroidRuntime::getJNIEnv(); 55d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 56d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber env->DeleteGlobalRef(mByteArrayObj); 57d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mByteArrayObj = NULL; 58d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber env->DeleteWeakGlobalRef(mObject); 59d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mObject = NULL; 60d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber env->DeleteGlobalRef(mClass); 61d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber mClass = NULL; 62d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 63d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 64d2506a506303ed94fd1991cf986b825b870a67c5Andreas Hubersp<IMemory> JMediaHTTPConnection::getIMemory() { 65d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber return mMemory; 66d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 67d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 68d2506a506303ed94fd1991cf986b825b870a67c5Andreas HuberjbyteArray JMediaHTTPConnection::getByteArrayObj() { 69d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber return mByteArrayObj; 70d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 71d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 72d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} // namespace android 73d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 74d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberusing namespace android; 75d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 76d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstruct fields_t { 77d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jfieldID context; 78d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 79d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jmethodID readAtMethodID; 80d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber}; 81d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 82d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstatic fields_t gFields; 83d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 84d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstatic sp<JMediaHTTPConnection> setObject( 85d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz, const sp<JMediaHTTPConnection> &conn) { 86d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<JMediaHTTPConnection> old = 875e8ff02ec93aa0f933d0082d9a0e066b552c6a80Colin Cross (JMediaHTTPConnection *)env->GetLongField(thiz, gFields.context); 88d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 89d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (conn != NULL) { 90d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber conn->incStrong(thiz); 91d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 92d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (old != NULL) { 93d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber old->decStrong(thiz); 94d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 955e8ff02ec93aa0f933d0082d9a0e066b552c6a80Colin Cross env->SetLongField(thiz, gFields.context, (jlong)conn.get()); 96d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 97d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber return old; 98d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 99d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 100d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstatic sp<JMediaHTTPConnection> getObject(JNIEnv *env, jobject thiz) { 1015e8ff02ec93aa0f933d0082d9a0e066b552c6a80Colin Cross return (JMediaHTTPConnection *)env->GetLongField(thiz, gFields.context); 102d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 103d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 104d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstatic void android_media_MediaHTTPConnection_native_init(JNIEnv *env) { 105d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber ScopedLocalRef<jclass> clazz( 106d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber env, env->FindClass("android/media/MediaHTTPConnection")); 107d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber CHECK(clazz.get() != NULL); 108d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 1097acd69be86b77d27759fa312a78fd0be26ee1ab2Colin Cross gFields.context = env->GetFieldID(clazz.get(), "mNativeContext", "J"); 110d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber CHECK(gFields.context != NULL); 111d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 112d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber gFields.readAtMethodID = env->GetMethodID(clazz.get(), "readAt", "(J[BI)I"); 113d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 114d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 115d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstatic void android_media_MediaHTTPConnection_native_setup( 116d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz) { 117d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<JMediaHTTPConnection> conn = new JMediaHTTPConnection(env, thiz); 118d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 119d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber setObject(env, thiz, conn); 120d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 121d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 122d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstatic void android_media_MediaHTTPConnection_native_finalize( 123d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz) { 124d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber setObject(env, thiz, NULL); 125d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 126d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 127d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstatic jobject android_media_MediaHTTPConnection_native_getIMemory( 128d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz) { 129d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<JMediaHTTPConnection> conn = getObject(env, thiz); 130d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 131dce97407dcf54ae9725c2d29224f6ed8dfd994b8Marco Nelissen return javaObjectForIBinder(env, IInterface::asBinder(conn->getIMemory())); 132d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 133d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 134d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberstatic jint android_media_MediaHTTPConnection_native_readAt( 135d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz, jlong offset, jint size) { 136d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<JMediaHTTPConnection> conn = getObject(env, thiz); 137d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (size > JMediaHTTPConnection::kBufferSize) { 138d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber size = JMediaHTTPConnection::kBufferSize; 139d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 140d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 141d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jbyteArray byteArrayObj = conn->getByteArrayObj(); 142d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 143d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jint n = env->CallIntMethod( 144d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber thiz, gFields.readAtMethodID, offset, byteArrayObj, size); 145d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 146d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (n > 0) { 147d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber env->GetByteArrayRegion( 148d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber byteArrayObj, 149d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 0, 150d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber n, 151d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber (jbyte *)conn->getIMemory()->pointer()); 152d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 153d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 154d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber return n; 155d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 156d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 15776f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 158d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber { "native_getIMemory", "()Landroid/os/IBinder;", 159d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber (void *)android_media_MediaHTTPConnection_native_getIMemory }, 160d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 161d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber { "native_readAt", "(JI)I", 162d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber (void *)android_media_MediaHTTPConnection_native_readAt }, 163d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 164d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber { "native_init", "()V", 165d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber (void *)android_media_MediaHTTPConnection_native_init }, 166d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 167d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber { "native_setup", "()V", 168d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber (void *)android_media_MediaHTTPConnection_native_setup }, 169d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 170d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber { "native_finalize", "()V", 171d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber (void *)android_media_MediaHTTPConnection_native_finalize }, 172d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber}; 173d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 174d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberint register_android_media_MediaHTTPConnection(JNIEnv *env) { 175d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber return AndroidRuntime::registerNativeMethods(env, 176d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "android/media/MediaHTTPConnection", gMethods, NELEM(gMethods)); 177d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber} 178d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 179