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#ifndef android_nio_utils_DEFINED
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define android_nio_utils_DEFINED
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Given an nio.Buffer, return a pointer to it, beginning at its current
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * position. The returned pointer is only valid for the current JNI stack-frame.
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For performance, it does not create any global references, so the getPointer
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (and releasePointer if array is returned non-null) must be done in the
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * same JNI stack-frame.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param env   The current JNI env
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param buffer    The nio.Buffer object
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param array     REQUIRED. Output. If on return it is set to non-null, then
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                  nio_releasePointer must be called with the array
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                  and the returned pointer when the caller is through with it.
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                  If on return it is set to null, do not call
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                  nio_releasePointer.
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The pointer to the memory in the buffer object
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid* nio_getPointer(JNIEnv *env, jobject buffer, jarray *array);
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call this if android_nio_getPointer returned non-null in its array parameter.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass that array and the returned pointer when you are done accessing the
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pointer. If called (i.e. array is non-null), it must be called in the same
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI stack-frame as getPointer
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param env   The current JNI env
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param buffer    The array returned from android_nio_getPointer (!= null)
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pointer   The pointer returned by android_nio_getPointer
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param commit    JNI_FALSE if the pointer was just read, and JNI_TRUE if
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *                  the pointer was written to.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid nio_releasePointer(JNIEnv *env, jarray array, void *pointer,
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                jboolean commit);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AutoBufferPointer {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AutoBufferPointer(JNIEnv* env, jobject nioBuffer, jboolean commit);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ~AutoBufferPointer();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* pointer() const { return fPointer; }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv* fEnv;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void*   fPointer;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jarray  fArray;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint    fRemaining;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jboolean fCommit;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}   /* namespace android */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
75