xref: /aosp_15_r20/external/aws-crt-java/src/native/crt.h (revision 3c7ae9de214676c52d19f01067dc1a404272dc11)
1*3c7ae9deSAndroid Build Coastguard Worker /**
2*3c7ae9deSAndroid Build Coastguard Worker  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3*3c7ae9deSAndroid Build Coastguard Worker  * SPDX-License-Identifier: Apache-2.0.
4*3c7ae9deSAndroid Build Coastguard Worker  */
5*3c7ae9deSAndroid Build Coastguard Worker 
6*3c7ae9deSAndroid Build Coastguard Worker #ifndef AWS_JNI_CRT_H
7*3c7ae9deSAndroid Build Coastguard Worker #define AWS_JNI_CRT_H
8*3c7ae9deSAndroid Build Coastguard Worker 
9*3c7ae9deSAndroid Build Coastguard Worker #include <aws/common/byte_buf.h>
10*3c7ae9deSAndroid Build Coastguard Worker #include <aws/common/common.h>
11*3c7ae9deSAndroid Build Coastguard Worker #include <aws/common/logging.h>
12*3c7ae9deSAndroid Build Coastguard Worker #include <aws/common/string.h>
13*3c7ae9deSAndroid Build Coastguard Worker 
14*3c7ae9deSAndroid Build Coastguard Worker #include <jni.h>
15*3c7ae9deSAndroid Build Coastguard Worker 
16*3c7ae9deSAndroid Build Coastguard Worker #define AWS_CRT_JAVA_PACKAGE_ID 9
17*3c7ae9deSAndroid Build Coastguard Worker 
18*3c7ae9deSAndroid Build Coastguard Worker enum aws_java_crt_log_subject {
19*3c7ae9deSAndroid Build Coastguard Worker     AWS_LS_JAVA_CRT_GENERAL = AWS_LOG_SUBJECT_BEGIN_RANGE(AWS_CRT_JAVA_PACKAGE_ID),
20*3c7ae9deSAndroid Build Coastguard Worker     AWS_LS_JAVA_CRT_RESOURCE,
21*3c7ae9deSAndroid Build Coastguard Worker     AWS_LS_JAVA_CRT_S3,
22*3c7ae9deSAndroid Build Coastguard Worker     AWS_LS_JAVA_ANDROID_KEYCHAIN,
23*3c7ae9deSAndroid Build Coastguard Worker 
24*3c7ae9deSAndroid Build Coastguard Worker     AWS_LS_JAVA_CRT_LAST = AWS_LOG_SUBJECT_END_RANGE(AWS_CRT_JAVA_PACKAGE_ID),
25*3c7ae9deSAndroid Build Coastguard Worker };
26*3c7ae9deSAndroid Build Coastguard Worker 
27*3c7ae9deSAndroid Build Coastguard Worker enum aws_java_crt_error {
28*3c7ae9deSAndroid Build Coastguard Worker     AWS_ERROR_JAVA_CRT_JVM_DESTROYED = AWS_ERROR_ENUM_BEGIN_RANGE(AWS_CRT_JAVA_PACKAGE_ID),
29*3c7ae9deSAndroid Build Coastguard Worker     AWS_ERROR_JAVA_CRT_JVM_OUT_OF_MEMORY,
30*3c7ae9deSAndroid Build Coastguard Worker 
31*3c7ae9deSAndroid Build Coastguard Worker     AWS_ERROR_JAVA_CRT_END_RANGE = AWS_ERROR_ENUM_END_RANGE(AWS_CRT_JAVA_PACKAGE_ID),
32*3c7ae9deSAndroid Build Coastguard Worker };
33*3c7ae9deSAndroid Build Coastguard Worker 
34*3c7ae9deSAndroid Build Coastguard Worker struct aws_allocator *aws_jni_get_allocator(void);
35*3c7ae9deSAndroid Build Coastguard Worker 
36*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
37*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_throw_runtime_exception - throws a crt.CrtRuntimeException with the
38*3c7ae9deSAndroid Build Coastguard Worker  * supplied message, sprintf formatted. Control WILL return from this function,
39*3c7ae9deSAndroid Build Coastguard Worker  * so after calling it, make sure to clean up any native resources before exiting
40*3c7ae9deSAndroid Build Coastguard Worker  * the calling JNIEXPORT function.
41*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
42*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_throw_runtime_exception(JNIEnv *env, const char *msg, ...);
43*3c7ae9deSAndroid Build Coastguard Worker 
44*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
45*3c7ae9deSAndroid Build Coastguard Worker  * Throws java NullPointerException
46*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
47*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_throw_null_pointer_exception(JNIEnv *env, const char *msg, ...);
48*3c7ae9deSAndroid Build Coastguard Worker 
49*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
50*3c7ae9deSAndroid Build Coastguard Worker  * Throws java IllegalArgumentException
51*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
52*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_throw_illegal_argument_exception(JNIEnv *env, const char *msg, ...);
53*3c7ae9deSAndroid Build Coastguard Worker 
54*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
55*3c7ae9deSAndroid Build Coastguard Worker  * Checks whether or not an exception is pending on the stack and clears it.
56*3c7ae9deSAndroid Build Coastguard Worker  * If an exception was pending, it is cleared.
57*3c7ae9deSAndroid Build Coastguard Worker  *
58*3c7ae9deSAndroid Build Coastguard Worker  * @return true if an exception was pending, false otherwise. If it returns true
59*3c7ae9deSAndroid Build Coastguard Worker  * the pending exception was cleared.
60*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
61*3c7ae9deSAndroid Build Coastguard Worker bool aws_jni_check_and_clear_exception(JNIEnv *env);
62*3c7ae9deSAndroid Build Coastguard Worker 
63*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
64*3c7ae9deSAndroid Build Coastguard Worker  * Checks whether or not an exception is pending on the stack.
65*3c7ae9deSAndroid Build Coastguard Worker  * If the exception is pending, deletes existing global reference of `out`, sets `out` to the new exception and clears
66*3c7ae9deSAndroid Build Coastguard Worker  * it.
67*3c7ae9deSAndroid Build Coastguard Worker  *
68*3c7ae9deSAndroid Build Coastguard Worker  * @param env A pointer to the JNI environment, used to interact with the JVM.
69*3c7ae9deSAndroid Build Coastguard Worker  * @param out A pointer to a jthrowable object. If an exception is pending, the function
70*3c7ae9deSAndroid Build Coastguard Worker  *            deletes any existing global reference pointed to by 'out', and sets 'out'
71*3c7ae9deSAndroid Build Coastguard Worker  *            to point to the new exception. Must not be NULL.
72*3c7ae9deSAndroid Build Coastguard Worker  *
73*3c7ae9deSAndroid Build Coastguard Worker  * @return true if an exception was pending and has been cleared; false otherwise.
74*3c7ae9deSAndroid Build Coastguard Worker  *
75*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
76*3c7ae9deSAndroid Build Coastguard Worker bool aws_jni_get_and_clear_exception(JNIEnv *env, jthrowable *out);
77*3c7ae9deSAndroid Build Coastguard Worker 
78*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
79*3c7ae9deSAndroid Build Coastguard Worker  * Set a size_t based on a jlong.
80*3c7ae9deSAndroid Build Coastguard Worker  * If conversion fails, a java IllegalArgumentException is thrown like
81*3c7ae9deSAndroid Build Coastguard Worker  * "{errmsg_prefix} cannot be negative" and AWS_OP_ERR is returned.
82*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
83*3c7ae9deSAndroid Build Coastguard Worker int aws_size_t_from_java(JNIEnv *env, size_t *out_size, jlong java_long, const char *errmsg_prefix);
84*3c7ae9deSAndroid Build Coastguard Worker 
85*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
86*3c7ae9deSAndroid Build Coastguard Worker  * aws_java_byte_array_new - Creates a new Java byte[]
87*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
88*3c7ae9deSAndroid Build Coastguard Worker jbyteArray aws_java_byte_array_new(JNIEnv *env, size_t size);
89*3c7ae9deSAndroid Build Coastguard Worker 
90*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
91*3c7ae9deSAndroid Build Coastguard Worker  * aws_copy_java_byte_array_to_native_array - Copies from a Java byte[] to a Native byte array.
92*3c7ae9deSAndroid Build Coastguard Worker  * Returns false if ArrayIndexOutOfBoundsException occurred.
93*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
94*3c7ae9deSAndroid Build Coastguard Worker bool aws_copy_java_byte_array_to_native_array(JNIEnv *env, jbyteArray src, uint8_t *dst, size_t amount);
95*3c7ae9deSAndroid Build Coastguard Worker 
96*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
97*3c7ae9deSAndroid Build Coastguard Worker  * aws_copy_java_byte_array_to_native_array - Copies from a Native byte array to a Java byte[]
98*3c7ae9deSAndroid Build Coastguard Worker  * Returns false if ArrayIndexOutOfBoundsException occurred.
99*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
100*3c7ae9deSAndroid Build Coastguard Worker bool aws_copy_native_array_to_java_byte_array(JNIEnv *env, jbyteArray dst, uint8_t *src, size_t amount);
101*3c7ae9deSAndroid Build Coastguard Worker 
102*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
103*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_array_from_cursor - Creates a jbyteArray from a aws_byte_cursor.
104*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
105*3c7ae9deSAndroid Build Coastguard Worker jbyteArray aws_jni_byte_array_from_cursor(JNIEnv *env, const struct aws_byte_cursor *native_data);
106*3c7ae9deSAndroid Build Coastguard Worker 
107*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
108*3c7ae9deSAndroid Build Coastguard Worker  * jni_byte_buffer_copy_from_cursor - Creates a Java ByteBuffer from a native aws_byte_cursor
109*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
110*3c7ae9deSAndroid Build Coastguard Worker jobject aws_jni_byte_buffer_copy_from_cursor(JNIEnv *env, const struct aws_byte_cursor *native_data);
111*3c7ae9deSAndroid Build Coastguard Worker 
112*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
113*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_string_from_cursor - Creates a Java String from a cursor.
114*3c7ae9deSAndroid Build Coastguard Worker  * This function never returns NULL. It produces a fatal assertion if the allocator is out of memory.
115*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
116*3c7ae9deSAndroid Build Coastguard Worker jstring aws_jni_string_from_cursor(JNIEnv *env, const struct aws_byte_cursor *native_data);
117*3c7ae9deSAndroid Build Coastguard Worker 
118*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
119*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_string_from_cursor - Creates a Java String from a string.
120*3c7ae9deSAndroid Build Coastguard Worker  * This function never returns NULL. It produces a fatal assertion if the allocator is out of memory.
121*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
122*3c7ae9deSAndroid Build Coastguard Worker jstring aws_jni_string_from_string(JNIEnv *env, const struct aws_string *string);
123*3c7ae9deSAndroid Build Coastguard Worker 
124*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
125*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_native_byte_buf_from_java_direct_byte_buf - Populates a aws_byte_buf from a Java DirectByteBuffer
126*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
127*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_native_byte_buf_from_java_direct_byte_buf(JNIEnv *env, jobject directBuf, struct aws_byte_buf *dst);
128*3c7ae9deSAndroid Build Coastguard Worker 
129*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
130*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_direct_byte_buffer_from_raw_ptr - Creates a Java Direct ByteBuffer from raw pointer and length
131*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
132*3c7ae9deSAndroid Build Coastguard Worker jobject aws_jni_direct_byte_buffer_from_raw_ptr(JNIEnv *env, const void *dst, size_t capacity);
133*3c7ae9deSAndroid Build Coastguard Worker 
134*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
135*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_buffer_get_position - Gets the Read/Write Position of a ByteBuffer
136*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
137*3c7ae9deSAndroid Build Coastguard Worker int aws_jni_byte_buffer_get_position(JNIEnv *env, jobject java_byte_buffer);
138*3c7ae9deSAndroid Build Coastguard Worker 
139*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
140*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_buffer_set_position - Sets the Read/Write Position of a ByteBuffer
141*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
142*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_byte_buffer_set_position(JNIEnv *env, jobject jByteBuf, jint position);
143*3c7ae9deSAndroid Build Coastguard Worker 
144*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
145*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_buffer_set_limit - Sets the Read/Write Limit of a ByteBuffer
146*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
147*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_byte_buffer_set_limit(JNIEnv *env, jobject jByteBuf, jint limit);
148*3c7ae9deSAndroid Build Coastguard Worker 
149*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
150*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_cursor_from_jstring_acquire - Creates an aws_byte_cursor from the UTF-8
151*3c7ae9deSAndroid Build Coastguard Worker  * characters extracted from the supplied jstring. The string value is null-terminated.
152*3c7ae9deSAndroid Build Coastguard Worker  * The aws_byte_cursor MUST be given to aws_jni_byte_cursor_from jstring_release() when
153*3c7ae9deSAndroid Build Coastguard Worker  * it's no longer needed, or it will leak.
154*3c7ae9deSAndroid Build Coastguard Worker  *
155*3c7ae9deSAndroid Build Coastguard Worker  * If there is an error, the returned aws_byte_cursor.ptr will be NULL and
156*3c7ae9deSAndroid Build Coastguard Worker  * and a java exception is being thrown (OutOfMemoryError or NullPointerException)
157*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
158*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor aws_jni_byte_cursor_from_jstring_acquire(JNIEnv *env, jstring str);
159*3c7ae9deSAndroid Build Coastguard Worker 
160*3c7ae9deSAndroid Build Coastguard Worker /********************************************************************************
161*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_cursor_from_jstring_release - Releases the string back to the JVM
162*3c7ae9deSAndroid Build Coastguard Worker  ********************************************************************************/
163*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_byte_cursor_from_jstring_release(JNIEnv *env, jstring str, struct aws_byte_cursor cur);
164*3c7ae9deSAndroid Build Coastguard Worker 
165*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
166*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_cursor_from_jbyteArray_acquire - Creates an aws_byte_cursor from the
167*3c7ae9deSAndroid Build Coastguard Worker  * bytes extracted from the supplied jbyteArray.
168*3c7ae9deSAndroid Build Coastguard Worker  * The aws_byte_cursor MUST be given to aws_jni_byte_cursor_from jstring_release() when
169*3c7ae9deSAndroid Build Coastguard Worker  * it's no longer needed, or it will leak.
170*3c7ae9deSAndroid Build Coastguard Worker  *
171*3c7ae9deSAndroid Build Coastguard Worker  * If there is an error, the returned aws_byte_cursor.ptr will be NULL and
172*3c7ae9deSAndroid Build Coastguard Worker  * and a java exception is being thrown.
173*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
174*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor aws_jni_byte_cursor_from_jbyteArray_acquire(JNIEnv *env, jbyteArray str);
175*3c7ae9deSAndroid Build Coastguard Worker 
176*3c7ae9deSAndroid Build Coastguard Worker /********************************************************************************
177*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_cursor_from_jbyteArray_release - Releases the array back to the JVM
178*3c7ae9deSAndroid Build Coastguard Worker  ********************************************************************************/
179*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_byte_cursor_from_jbyteArray_release(JNIEnv *env, jbyteArray str, struct aws_byte_cursor cur);
180*3c7ae9deSAndroid Build Coastguard Worker 
181*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
182*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_byte_cursor_from_direct_byte_buffer - Creates an aws_byte_cursor from the
183*3c7ae9deSAndroid Build Coastguard Worker  * direct byte buffer. Note that the buffer is not reference pinned, so the cursor
184*3c7ae9deSAndroid Build Coastguard Worker  * is only valid for the current JNI call
185*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
186*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor aws_jni_byte_cursor_from_direct_byte_buffer(JNIEnv *env, jobject byte_buffer);
187*3c7ae9deSAndroid Build Coastguard Worker 
188*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
189*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_new_string_from_jstring - Creates a new aws_string from the UTF-8
190*3c7ae9deSAndroid Build Coastguard Worker  * characters extracted from the supplied jstring. The string must be destroyed
191*3c7ae9deSAndroid Build Coastguard Worker  * via aws_string_destroy or aws_string_destroy_secure
192*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
193*3c7ae9deSAndroid Build Coastguard Worker struct aws_string *aws_jni_new_string_from_jstring(JNIEnv *env, jstring str);
194*3c7ae9deSAndroid Build Coastguard Worker 
195*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
196*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_acquire_thread_env - Acquires the JNIEnv for the current thread from the VM,
197*3c7ae9deSAndroid Build Coastguard Worker  * attaching the env if necessary.  aws_jni_release_thread_env() must be called once
198*3c7ae9deSAndroid Build Coastguard Worker  * the caller is through with the environment.
199*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
200*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *aws_jni_acquire_thread_env(JavaVM *jvm);
201*3c7ae9deSAndroid Build Coastguard Worker 
202*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
203*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_release_thread_env - Releases an acquired JNIEnv for the current thread.  Every successfully
204*3c7ae9deSAndroid Build Coastguard Worker  * acquired JNIEnv must be released exactly once.  Internally, all this does is release the reader
205*3c7ae9deSAndroid Build Coastguard Worker  * lock on the set of valid JVMs.
206*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
207*3c7ae9deSAndroid Build Coastguard Worker void aws_jni_release_thread_env(JavaVM *jvm, JNIEnv *env);
208*3c7ae9deSAndroid Build Coastguard Worker 
209*3c7ae9deSAndroid Build Coastguard Worker /*******************************************************************************
210*3c7ae9deSAndroid Build Coastguard Worker  * aws_jni_new_crt_exception_from_error_code - Creates a new jobject from the aws
211*3c7ae9deSAndroid Build Coastguard Worker  * error code, which is the type of software/amazon/awssdk/crt/CrtRuntimeException.
212*3c7ae9deSAndroid Build Coastguard Worker  * Reference of the jobject needed to be cleaned up after use.
213*3c7ae9deSAndroid Build Coastguard Worker  ******************************************************************************/
214*3c7ae9deSAndroid Build Coastguard Worker jobject aws_jni_new_crt_exception_from_error_code(JNIEnv *env, int error_code);
215*3c7ae9deSAndroid Build Coastguard Worker 
216*3c7ae9deSAndroid Build Coastguard Worker #endif /* AWS_JNI_CRT_H */
217