19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_nio_utils.h" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 20987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct NioJNIData { 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass nioAccessClass; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID getBasePointerID; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID getBaseArrayID; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID getBaseArrayOffsetID; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic NioJNIData gNioJNI; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* android::nio_getPointer(JNIEnv *_env, jobject buffer, jarray *array) { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(array); 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jlong pointer; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint offset; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void *data; 37dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pointer = _env->CallStaticLongMethod(gNioJNI.nioAccessClass, 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gNioJNI.getBasePointerID, buffer); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pointer != 0L) { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *array = NULL; 42f5df700e6ce056ebfa322314d970e52d6facc35aAshok Bhat return reinterpret_cast<void *>(pointer); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *array = (jarray) _env->CallStaticObjectMethod(gNioJNI.nioAccessClass, 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gNioJNI.getBaseArrayID, buffer); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offset = _env->CallStaticIntMethod(gNioJNI.nioAccessClass, 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gNioJNI.getBaseArrayOffsetID, buffer); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0); 50dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (void *) ((char *) data + offset); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid android::nio_releasePointer(JNIEnv *_env, jarray array, void *data, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean commit) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project _env->ReleasePrimitiveArrayCritical(array, data, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project commit ? 0 : JNI_ABORT); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid::AutoBufferPointer::AutoBufferPointer(JNIEnv* env, jobject nioBuffer, 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean commit) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fEnv = env; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fCommit = commit; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fPointer = android::nio_getPointer(env, nioBuffer, &fArray); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid::AutoBufferPointer::~AutoBufferPointer() { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL != fArray) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android::nio_releasePointer(fEnv, fArray, fPointer, fCommit); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/////////////////////////////////////////////////////////////////////////////// 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 79dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_nio_utils(JNIEnv* env) { 81987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass localClass = FindClassOrDie(env, "java/nio/NIOAccess"); 82987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNioJNI.getBasePointerID = GetStaticMethodIDOrDie(env, localClass, "getBasePointer", 83987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/nio/Buffer;)J"); 84987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNioJNI.getBaseArrayID = GetStaticMethodIDOrDie(env, localClass, "getBaseArray", 85987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/nio/Buffer;)Ljava/lang/Object;"); 86987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNioJNI.getBaseArrayOffsetID = GetStaticMethodIDOrDie(env, localClass, "getBaseArrayOffset", 87987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/nio/Buffer;)I"); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now record a permanent version of the class ID 90987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gNioJNI.nioAccessClass = MakeGlobalRefOrDie(env, localClass); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 96