xref: /aosp_15_r20/libnativehelper/include_platform/nativehelper/JNIPlatformHelp.h (revision 0797b24ee566c78eb48500180cb4bf71f81c8aab)
1*0797b24eSAndroid Build Coastguard Worker /*
2*0797b24eSAndroid Build Coastguard Worker  * Copyright (C) 2007 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 /*
18*0797b24eSAndroid Build Coastguard Worker  * JNI helper functions.
19*0797b24eSAndroid Build Coastguard Worker  *
20*0797b24eSAndroid Build Coastguard Worker  * This file may be included by C or C++ code, which is trouble because jni.h
21*0797b24eSAndroid Build Coastguard Worker  * uses different typedefs for JNIEnv in each language.
22*0797b24eSAndroid Build Coastguard Worker  */
23*0797b24eSAndroid Build Coastguard Worker #pragma once
24*0797b24eSAndroid Build Coastguard Worker 
25*0797b24eSAndroid Build Coastguard Worker #include <sys/cdefs.h>
26*0797b24eSAndroid Build Coastguard Worker 
27*0797b24eSAndroid Build Coastguard Worker #include <jni.h>
28*0797b24eSAndroid Build Coastguard Worker 
29*0797b24eSAndroid Build Coastguard Worker #include <nativehelper/JNIHelp.h>
30*0797b24eSAndroid Build Coastguard Worker 
31*0797b24eSAndroid Build Coastguard Worker __BEGIN_DECLS
32*0797b24eSAndroid Build Coastguard Worker 
33*0797b24eSAndroid Build Coastguard Worker /*
34*0797b24eSAndroid Build Coastguard Worker  * Gets the managed heap array backing a java.nio.Buffer instance.
35*0797b24eSAndroid Build Coastguard Worker  *
36*0797b24eSAndroid Build Coastguard Worker  * Returns nullptr if there is no array backing.
37*0797b24eSAndroid Build Coastguard Worker  *
38*0797b24eSAndroid Build Coastguard Worker  * This method performs a JNI call to java.nio.NIOAccess.getBaseArray().
39*0797b24eSAndroid Build Coastguard Worker  */
40*0797b24eSAndroid Build Coastguard Worker jarray jniGetNioBufferBaseArray(C_JNIEnv* env, jobject nioBuffer);
41*0797b24eSAndroid Build Coastguard Worker 
42*0797b24eSAndroid Build Coastguard Worker /*
43*0797b24eSAndroid Build Coastguard Worker  * Gets the offset of the current buffer position in bytes from the start of the managed heap
44*0797b24eSAndroid Build Coastguard Worker  * array backing the buffer.
45*0797b24eSAndroid Build Coastguard Worker  *
46*0797b24eSAndroid Build Coastguard Worker  * Returns 0 if there is no array backing.
47*0797b24eSAndroid Build Coastguard Worker  *
48*0797b24eSAndroid Build Coastguard Worker  * This method performs a JNI call to java.nio.NIOAccess.getBaseArrayOffset().
49*0797b24eSAndroid Build Coastguard Worker  */
50*0797b24eSAndroid Build Coastguard Worker jint jniGetNioBufferBaseArrayOffset(C_JNIEnv* env, jobject nioBuffer);
51*0797b24eSAndroid Build Coastguard Worker 
52*0797b24eSAndroid Build Coastguard Worker /*
53*0797b24eSAndroid Build Coastguard Worker  * Gets field information from a java.nio.Buffer instance.
54*0797b24eSAndroid Build Coastguard Worker  *
55*0797b24eSAndroid Build Coastguard Worker  * Reads the |position|, |limit|, and |elementSizeShift| fields from the buffer instance.
56*0797b24eSAndroid Build Coastguard Worker  *
57*0797b24eSAndroid Build Coastguard Worker  * Returns the |address| field of the java.nio.Buffer instance which is only valid (non-zero) when
58*0797b24eSAndroid Build Coastguard Worker  * the buffer is backed by a direct buffer.
59*0797b24eSAndroid Build Coastguard Worker  */
60*0797b24eSAndroid Build Coastguard Worker jlong jniGetNioBufferFields(C_JNIEnv* env,
61*0797b24eSAndroid Build Coastguard Worker                             jobject nioBuffer,
62*0797b24eSAndroid Build Coastguard Worker                             /*out*/jint* position,
63*0797b24eSAndroid Build Coastguard Worker                             /*out*/jint* limit,
64*0797b24eSAndroid Build Coastguard Worker                             /*out*/jint* elementSizeShift);
65*0797b24eSAndroid Build Coastguard Worker 
66*0797b24eSAndroid Build Coastguard Worker /*
67*0797b24eSAndroid Build Coastguard Worker  * Gets the current position from a java.nio.Buffer as a pointer to memory in a fixed buffer.
68*0797b24eSAndroid Build Coastguard Worker  *
69*0797b24eSAndroid Build Coastguard Worker  * Returns 0 if |nioBuffer| is not backed by a direct buffer.
70*0797b24eSAndroid Build Coastguard Worker  *
71*0797b24eSAndroid Build Coastguard Worker  * This method reads the |address|, |position|, and |elementSizeShift| fields from the
72*0797b24eSAndroid Build Coastguard Worker  * java.nio.Buffer instance to calculate the pointer address for the current position.
73*0797b24eSAndroid Build Coastguard Worker  */
74*0797b24eSAndroid Build Coastguard Worker jlong jniGetNioBufferPointer(C_JNIEnv* env, jobject nioBuffer);
75*0797b24eSAndroid Build Coastguard Worker 
76*0797b24eSAndroid Build Coastguard Worker /*
77*0797b24eSAndroid Build Coastguard Worker  * Clear the cache of constants libnativehelper is using.
78*0797b24eSAndroid Build Coastguard Worker  */
79*0797b24eSAndroid Build Coastguard Worker void jniUninitializeConstants();
80*0797b24eSAndroid Build Coastguard Worker 
81*0797b24eSAndroid Build Coastguard Worker __END_DECLS
82*0797b24eSAndroid Build Coastguard Worker 
83*0797b24eSAndroid Build Coastguard Worker /*
84*0797b24eSAndroid Build Coastguard Worker  * For C++ code, we provide inlines that map to the C functions.  g++ always
85*0797b24eSAndroid Build Coastguard Worker  * inlines these, even on non-optimized builds.
86*0797b24eSAndroid Build Coastguard Worker  */
87*0797b24eSAndroid Build Coastguard Worker 
88*0797b24eSAndroid Build Coastguard Worker #if defined(__cplusplus)
89*0797b24eSAndroid Build Coastguard Worker 
90*0797b24eSAndroid Build Coastguard Worker #include <android/file_descriptor_jni.h>
91*0797b24eSAndroid Build Coastguard Worker 
jniCreateFileDescriptor(JNIEnv * env,int fd)92*0797b24eSAndroid Build Coastguard Worker inline jobject jniCreateFileDescriptor(JNIEnv* env, int fd) {
93*0797b24eSAndroid Build Coastguard Worker     jobject fileDescriptor = AFileDescriptor_create(env);
94*0797b24eSAndroid Build Coastguard Worker     if (fileDescriptor != nullptr) {
95*0797b24eSAndroid Build Coastguard Worker       AFileDescriptor_setFd(env, fileDescriptor, fd);
96*0797b24eSAndroid Build Coastguard Worker     }
97*0797b24eSAndroid Build Coastguard Worker     return fileDescriptor;
98*0797b24eSAndroid Build Coastguard Worker }
99*0797b24eSAndroid Build Coastguard Worker 
jniGetFDFromFileDescriptor(JNIEnv * env,jobject fileDescriptor)100*0797b24eSAndroid Build Coastguard Worker inline int jniGetFDFromFileDescriptor(JNIEnv* env, jobject fileDescriptor) {
101*0797b24eSAndroid Build Coastguard Worker     if (fileDescriptor == nullptr) {
102*0797b24eSAndroid Build Coastguard Worker       return -1;
103*0797b24eSAndroid Build Coastguard Worker     }
104*0797b24eSAndroid Build Coastguard Worker     return AFileDescriptor_getFd(env, fileDescriptor);
105*0797b24eSAndroid Build Coastguard Worker }
106*0797b24eSAndroid Build Coastguard Worker 
jniSetFileDescriptorOfFD(JNIEnv * env,jobject fileDescriptor,int value)107*0797b24eSAndroid Build Coastguard Worker inline void jniSetFileDescriptorOfFD(JNIEnv* env, jobject fileDescriptor, int value) {
108*0797b24eSAndroid Build Coastguard Worker     if (fileDescriptor == nullptr) {
109*0797b24eSAndroid Build Coastguard Worker         jniThrowNullPointerException(env, "fileDescriptor is null");
110*0797b24eSAndroid Build Coastguard Worker         return;
111*0797b24eSAndroid Build Coastguard Worker     }
112*0797b24eSAndroid Build Coastguard Worker     AFileDescriptor_setFd(env, fileDescriptor, value);
113*0797b24eSAndroid Build Coastguard Worker }
114*0797b24eSAndroid Build Coastguard Worker 
jniGetNioBufferBaseArray(JNIEnv * env,jobject nioBuffer)115*0797b24eSAndroid Build Coastguard Worker inline jarray jniGetNioBufferBaseArray(JNIEnv* env, jobject nioBuffer) {
116*0797b24eSAndroid Build Coastguard Worker     return jniGetNioBufferBaseArray(&env->functions, nioBuffer);
117*0797b24eSAndroid Build Coastguard Worker }
118*0797b24eSAndroid Build Coastguard Worker 
jniGetNioBufferBaseArrayOffset(JNIEnv * env,jobject nioBuffer)119*0797b24eSAndroid Build Coastguard Worker inline jint jniGetNioBufferBaseArrayOffset(JNIEnv* env, jobject nioBuffer) {
120*0797b24eSAndroid Build Coastguard Worker     return jniGetNioBufferBaseArrayOffset(&env->functions, nioBuffer);
121*0797b24eSAndroid Build Coastguard Worker }
122*0797b24eSAndroid Build Coastguard Worker 
jniGetNioBufferFields(JNIEnv * env,jobject nioBuffer,jint * position,jint * limit,jint * elementSizeShift)123*0797b24eSAndroid Build Coastguard Worker inline jlong jniGetNioBufferFields(JNIEnv* env, jobject nioBuffer,
124*0797b24eSAndroid Build Coastguard Worker                                    jint* position, jint* limit, jint* elementSizeShift) {
125*0797b24eSAndroid Build Coastguard Worker     return jniGetNioBufferFields(&env->functions, nioBuffer,
126*0797b24eSAndroid Build Coastguard Worker                                  position, limit, elementSizeShift);
127*0797b24eSAndroid Build Coastguard Worker }
128*0797b24eSAndroid Build Coastguard Worker 
jniGetNioBufferPointer(JNIEnv * env,jobject nioBuffer)129*0797b24eSAndroid Build Coastguard Worker inline jlong jniGetNioBufferPointer(JNIEnv* env, jobject nioBuffer) {
130*0797b24eSAndroid Build Coastguard Worker     return jniGetNioBufferPointer(&env->functions, nioBuffer);
131*0797b24eSAndroid Build Coastguard Worker }
132*0797b24eSAndroid Build Coastguard Worker 
133*0797b24eSAndroid Build Coastguard Worker #endif  // defined(__cplusplus)
134