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