xref: /aosp_15_r20/libnativehelper/JNIPlatformHelp.c (revision 0797b24ee566c78eb48500180cb4bf71f81c8aab)
1*0797b24eSAndroid Build Coastguard Worker /*
2*0797b24eSAndroid Build Coastguard Worker  * Copyright (C) 2006 The Android Open Source Project
3*0797b24eSAndroid Build Coastguard Worker  *
4*0797b24eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*0797b24eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*0797b24eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*0797b24eSAndroid Build Coastguard Worker  *
8*0797b24eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*0797b24eSAndroid Build Coastguard Worker  *
10*0797b24eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*0797b24eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*0797b24eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*0797b24eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*0797b24eSAndroid Build Coastguard Worker  * limitations under the License.
15*0797b24eSAndroid Build Coastguard Worker  */
16*0797b24eSAndroid Build Coastguard Worker 
17*0797b24eSAndroid Build Coastguard Worker #include "include_platform/nativehelper/JNIPlatformHelp.h"
18*0797b24eSAndroid Build Coastguard Worker 
19*0797b24eSAndroid Build Coastguard Worker #include <stddef.h>
20*0797b24eSAndroid Build Coastguard Worker 
21*0797b24eSAndroid Build Coastguard Worker #include "JniConstants.h"
22*0797b24eSAndroid Build Coastguard Worker 
GetBufferPosition(JNIEnv * env,jobject nioBuffer)23*0797b24eSAndroid Build Coastguard Worker static int GetBufferPosition(JNIEnv* env, jobject nioBuffer) {
24*0797b24eSAndroid Build Coastguard Worker     return(*env)->GetIntField(env, nioBuffer, JniConstants_NioBuffer_position(env));
25*0797b24eSAndroid Build Coastguard Worker }
26*0797b24eSAndroid Build Coastguard Worker 
GetBufferLimit(JNIEnv * env,jobject nioBuffer)27*0797b24eSAndroid Build Coastguard Worker static int GetBufferLimit(JNIEnv* env, jobject nioBuffer) {
28*0797b24eSAndroid Build Coastguard Worker     return(*env)->GetIntField(env, nioBuffer, JniConstants_NioBuffer_limit(env));
29*0797b24eSAndroid Build Coastguard Worker }
30*0797b24eSAndroid Build Coastguard Worker 
GetBufferElementSizeShift(JNIEnv * env,jobject nioBuffer)31*0797b24eSAndroid Build Coastguard Worker static int GetBufferElementSizeShift(JNIEnv* env, jobject nioBuffer) {
32*0797b24eSAndroid Build Coastguard Worker     return(*env)->GetIntField(env, nioBuffer, JniConstants_NioBuffer__elementSizeShift(env));
33*0797b24eSAndroid Build Coastguard Worker }
34*0797b24eSAndroid Build Coastguard Worker 
jniGetNioBufferBaseArray(JNIEnv * env,jobject nioBuffer)35*0797b24eSAndroid Build Coastguard Worker jarray jniGetNioBufferBaseArray(JNIEnv* env, jobject nioBuffer) {
36*0797b24eSAndroid Build Coastguard Worker     jclass nioAccessClass = JniConstants_NIOAccessClass(env);
37*0797b24eSAndroid Build Coastguard Worker     jmethodID getBaseArrayMethod = JniConstants_NIOAccess_getBaseArray(env);
38*0797b24eSAndroid Build Coastguard Worker     jobject object = (*env)->CallStaticObjectMethod(env,
39*0797b24eSAndroid Build Coastguard Worker                                                     nioAccessClass, getBaseArrayMethod, nioBuffer);
40*0797b24eSAndroid Build Coastguard Worker     return (jarray) object;
41*0797b24eSAndroid Build Coastguard Worker }
42*0797b24eSAndroid Build Coastguard Worker 
jniGetNioBufferBaseArrayOffset(JNIEnv * env,jobject nioBuffer)43*0797b24eSAndroid Build Coastguard Worker int jniGetNioBufferBaseArrayOffset(JNIEnv* env, jobject nioBuffer) {
44*0797b24eSAndroid Build Coastguard Worker     jclass nioAccessClass = JniConstants_NIOAccessClass(env);
45*0797b24eSAndroid Build Coastguard Worker     jmethodID getBaseArrayOffsetMethod = JniConstants_NIOAccess_getBaseArrayOffset(env);
46*0797b24eSAndroid Build Coastguard Worker     return (*env)->CallStaticIntMethod(env, nioAccessClass, getBaseArrayOffsetMethod, nioBuffer);
47*0797b24eSAndroid Build Coastguard Worker }
48*0797b24eSAndroid Build Coastguard Worker 
jniGetNioBufferPointer(JNIEnv * env,jobject nioBuffer)49*0797b24eSAndroid Build Coastguard Worker jlong jniGetNioBufferPointer(JNIEnv* env, jobject nioBuffer) {
50*0797b24eSAndroid Build Coastguard Worker     jlong baseAddress = (*env)->GetLongField(env, nioBuffer, JniConstants_NioBuffer_address(env));
51*0797b24eSAndroid Build Coastguard Worker     if (baseAddress != 0) {
52*0797b24eSAndroid Build Coastguard Worker         const int position = GetBufferPosition(env, nioBuffer);
53*0797b24eSAndroid Build Coastguard Worker         const int shift = GetBufferElementSizeShift(env, nioBuffer);
54*0797b24eSAndroid Build Coastguard Worker         baseAddress += position << shift;
55*0797b24eSAndroid Build Coastguard Worker     }
56*0797b24eSAndroid Build Coastguard Worker     return baseAddress;
57*0797b24eSAndroid Build Coastguard Worker }
58*0797b24eSAndroid Build Coastguard Worker 
jniGetNioBufferFields(JNIEnv * env,jobject nioBuffer,jint * position,jint * limit,jint * elementSizeShift)59*0797b24eSAndroid Build Coastguard Worker jlong jniGetNioBufferFields(JNIEnv* env, jobject nioBuffer,
60*0797b24eSAndroid Build Coastguard Worker                             jint* position, jint* limit, jint* elementSizeShift) {
61*0797b24eSAndroid Build Coastguard Worker     *position = GetBufferPosition(env, nioBuffer);
62*0797b24eSAndroid Build Coastguard Worker     *limit = GetBufferLimit(env, nioBuffer);
63*0797b24eSAndroid Build Coastguard Worker     *elementSizeShift = GetBufferElementSizeShift(env, nioBuffer);
64*0797b24eSAndroid Build Coastguard Worker     return (*env)->GetLongField(env, nioBuffer, JniConstants_NioBuffer_address(env));
65*0797b24eSAndroid Build Coastguard Worker }
66