diff --git a/.gitignore b/.gitignore index fbdc4bbe..2f2f0af4 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,7 @@ dependency-reduced-pom.xml .gradle .settings .classpath -.project \ No newline at end of file +.project + +# OSX +.DS_Store \ No newline at end of file diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc index 02ac9014..6ae70abb 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc @@ -69,4 +69,5 @@ RUN /usr/bin/c++ -c \ -laws-lambda-runtime \ -lcurl \ -static-libstdc++ \ - -lrt + -lrt \ + -O2 diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl index 31ff9fcb..f82ccfec 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl @@ -58,4 +58,5 @@ RUN /usr/bin/c++ -c \ -laws-lambda-runtime \ -lcurl \ -static-libstdc++ \ - -static-libgcc + -static-libgcc \ + -O2 diff --git a/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp b/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp index c6a1dabc..87fa9f02 100644 --- a/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp +++ b/aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp @@ -24,6 +24,48 @@ static aws::lambda_runtime::runtime * CLIENT = nullptr; +static jint JNI_VERSION = JNI_VERSION_1_8; + +static jclass invocationRequestClass; +static jfieldID invokedFunctionArnField; +static jfieldID deadlineTimeInMsField; +static jfieldID idField; +static jfieldID contentField; +static jfieldID clientContextField; +static jfieldID cognitoIdentityField; +static jfieldID xrayTraceIdField; + + +jint JNI_OnLoad(JavaVM* vm, void* reserved) { + + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION) != JNI_OK) { + return JNI_ERR; + } + + jclass tempInvocationRequestClassRef; + tempInvocationRequestClassRef = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/InvocationRequest"); + invocationRequestClass = (jclass) env->NewGlobalRef(tempInvocationRequestClassRef); + env->DeleteLocalRef(tempInvocationRequestClassRef); + + idField = env->GetFieldID(invocationRequestClass , "id", "Ljava/lang/String;"); + invokedFunctionArnField = env->GetFieldID(invocationRequestClass , "invokedFunctionArn", "Ljava/lang/String;"); + deadlineTimeInMsField = env->GetFieldID(invocationRequestClass , "deadlineTimeInMs", "J"); + contentField = env->GetFieldID(invocationRequestClass , "content", "[B"); + xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;"); + clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;"); + cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;"); + + return JNI_VERSION; +} + +void JNI_OnUnload(JavaVM *vm, void *reserved) { + JNIEnv* env; + vm->GetEnv(reinterpret_cast(&env), JNI_VERSION); + + env->DeleteGlobalRef(invocationRequestClass); +} + static void throwLambdaRuntimeClientException(JNIEnv *env, std::string message, aws::http::response_code responseCode){ jclass lambdaRuntimeExceptionClass = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/LambdaRuntimeClientException"); jstring jMessage = env->NewStringUTF(message.c_str()); @@ -56,50 +98,31 @@ JNIEXPORT jobject JNICALL Java_com_amazonaws_services_lambda_runtime_api_client_ return NULL; } - jclass invocationRequestClass; - jfieldID invokedFunctionArnField; - jfieldID deadlineTimeInMsField; - jfieldID xrayTraceIdField; - jfieldID idField; jobject invocationRequest; - jfieldID clientContextField; - jfieldID cognitoIdentityField; jbyteArray jArray; const jbyte* bytes; - jfieldID contentField; auto response = outcome.get_result(); - CHECK_EXCEPTION(env, invocationRequestClass = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/InvocationRequest")); CHECK_EXCEPTION(env, invocationRequest = env->AllocObject(invocationRequestClass)); - - CHECK_EXCEPTION(env, idField = env->GetFieldID(invocationRequestClass , "id", "Ljava/lang/String;")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, idField, env->NewStringUTF(response.request_id.c_str()))); - - CHECK_EXCEPTION(env, invokedFunctionArnField = env->GetFieldID(invocationRequestClass , "invokedFunctionArn", "Ljava/lang/String;")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, invokedFunctionArnField, env->NewStringUTF(response.function_arn.c_str()))); - - CHECK_EXCEPTION(env, deadlineTimeInMsField = env->GetFieldID(invocationRequestClass , "deadlineTimeInMs", "J")); CHECK_EXCEPTION(env, env->SetLongField(invocationRequest, deadlineTimeInMsField, std::chrono::duration_cast(response.deadline.time_since_epoch()).count())); if(response.xray_trace_id != ""){ - CHECK_EXCEPTION(env, xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, xrayTraceIdField, env->NewStringUTF(response.xray_trace_id.c_str()))); } if(response.client_context != ""){ - CHECK_EXCEPTION(env, clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, clientContextField, env->NewStringUTF(response.client_context.c_str()))); } if(response.cognito_identity != ""){ - CHECK_EXCEPTION(env, cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str()))); } bytes = reinterpret_cast(response.payload.c_str()); CHECK_EXCEPTION(env, jArray = env->NewByteArray(response.payload.length())); CHECK_EXCEPTION(env, env->SetByteArrayRegion(jArray, 0, response.payload.length(), bytes)); - CHECK_EXCEPTION(env, contentField = env->GetFieldID(invocationRequestClass , "content", "[B")); CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, contentField, jArray)); return invocationRequest;