|
24 | 24 |
|
25 | 25 | static aws::lambda_runtime::runtime * CLIENT = nullptr;
|
26 | 26 |
|
| 27 | +static jint JNI_VERSION = JNI_VERSION_1_8; |
| 28 | + |
| 29 | +static jclass invocationRequestClass; |
| 30 | +static jfieldID invokedFunctionArnField; |
| 31 | +static jfieldID deadlineTimeInMsField; |
| 32 | +static jfieldID idField; |
| 33 | +static jfieldID contentField; |
| 34 | +static jfieldID clientContextField; |
| 35 | +static jfieldID cognitoIdentityField; |
| 36 | +static jfieldID xrayTraceIdField; |
| 37 | + |
| 38 | + |
| 39 | +jint JNI_OnLoad(JavaVM* vm, void* reserved) { |
| 40 | + |
| 41 | + JNIEnv* env; |
| 42 | + if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK) { |
| 43 | + return JNI_ERR; |
| 44 | + } |
| 45 | + |
| 46 | + jclass tempInvocationRequestClassRef; |
| 47 | + tempInvocationRequestClassRef = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/InvocationRequest"); |
| 48 | + invocationRequestClass = (jclass) env->NewGlobalRef(tempInvocationRequestClassRef); |
| 49 | + env->DeleteLocalRef(tempInvocationRequestClassRef); |
| 50 | + |
| 51 | + idField = env->GetFieldID(invocationRequestClass , "id", "Ljava/lang/String;"); |
| 52 | + invokedFunctionArnField = env->GetFieldID(invocationRequestClass , "invokedFunctionArn", "Ljava/lang/String;"); |
| 53 | + deadlineTimeInMsField = env->GetFieldID(invocationRequestClass , "deadlineTimeInMs", "J"); |
| 54 | + contentField = env->GetFieldID(invocationRequestClass , "content", "[B"); |
| 55 | + xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;"); |
| 56 | + clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;"); |
| 57 | + cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;"); |
| 58 | + |
| 59 | + return JNI_VERSION; |
| 60 | +} |
| 61 | + |
| 62 | +void JNI_OnUnload(JavaVM *vm, void *reserved) { |
| 63 | + JNIEnv* env; |
| 64 | + vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION); |
| 65 | + |
| 66 | + env->DeleteGlobalRef(invocationRequestClass); |
| 67 | +} |
| 68 | + |
27 | 69 | static void throwLambdaRuntimeClientException(JNIEnv *env, std::string message, aws::http::response_code responseCode){
|
28 | 70 | jclass lambdaRuntimeExceptionClass = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/LambdaRuntimeClientException");
|
29 | 71 | jstring jMessage = env->NewStringUTF(message.c_str());
|
@@ -56,50 +98,31 @@ JNIEXPORT jobject JNICALL Java_com_amazonaws_services_lambda_runtime_api_client_
|
56 | 98 | return NULL;
|
57 | 99 | }
|
58 | 100 |
|
59 |
| - jclass invocationRequestClass; |
60 |
| - jfieldID invokedFunctionArnField; |
61 |
| - jfieldID deadlineTimeInMsField; |
62 |
| - jfieldID xrayTraceIdField; |
63 |
| - jfieldID idField; |
64 | 101 | jobject invocationRequest;
|
65 |
| - jfieldID clientContextField; |
66 |
| - jfieldID cognitoIdentityField; |
67 | 102 | jbyteArray jArray;
|
68 | 103 | const jbyte* bytes;
|
69 |
| - jfieldID contentField; |
70 | 104 | auto response = outcome.get_result();
|
71 | 105 |
|
72 |
| - CHECK_EXCEPTION(env, invocationRequestClass = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/InvocationRequest")); |
73 | 106 | CHECK_EXCEPTION(env, invocationRequest = env->AllocObject(invocationRequestClass));
|
74 |
| - |
75 |
| - CHECK_EXCEPTION(env, idField = env->GetFieldID(invocationRequestClass , "id", "Ljava/lang/String;")); |
76 | 107 | CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, idField, env->NewStringUTF(response.request_id.c_str())));
|
77 |
| - |
78 |
| - CHECK_EXCEPTION(env, invokedFunctionArnField = env->GetFieldID(invocationRequestClass , "invokedFunctionArn", "Ljava/lang/String;")); |
79 | 108 | CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, invokedFunctionArnField, env->NewStringUTF(response.function_arn.c_str())));
|
80 |
| - |
81 |
| - CHECK_EXCEPTION(env, deadlineTimeInMsField = env->GetFieldID(invocationRequestClass , "deadlineTimeInMs", "J")); |
82 | 109 | CHECK_EXCEPTION(env, env->SetLongField(invocationRequest, deadlineTimeInMsField, std::chrono::duration_cast<std::chrono::milliseconds>(response.deadline.time_since_epoch()).count()));
|
83 | 110 |
|
84 | 111 | if(response.xray_trace_id != ""){
|
85 |
| - CHECK_EXCEPTION(env, xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;")); |
86 | 112 | CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, xrayTraceIdField, env->NewStringUTF(response.xray_trace_id.c_str())));
|
87 | 113 | }
|
88 | 114 |
|
89 | 115 | if(response.client_context != ""){
|
90 |
| - CHECK_EXCEPTION(env, clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;")); |
91 | 116 | CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, clientContextField, env->NewStringUTF(response.client_context.c_str())));
|
92 | 117 | }
|
93 | 118 |
|
94 | 119 | if(response.cognito_identity != ""){
|
95 |
| - CHECK_EXCEPTION(env, cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;")); |
96 | 120 | CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str())));
|
97 | 121 | }
|
98 | 122 |
|
99 | 123 | bytes = reinterpret_cast<const jbyte*>(response.payload.c_str());
|
100 | 124 | CHECK_EXCEPTION(env, jArray = env->NewByteArray(response.payload.length()));
|
101 | 125 | CHECK_EXCEPTION(env, env->SetByteArrayRegion(jArray, 0, response.payload.length(), bytes));
|
102 |
| - CHECK_EXCEPTION(env, contentField = env->GetFieldID(invocationRequestClass , "content", "[B")); |
103 | 126 | CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, contentField, jArray));
|
104 | 127 |
|
105 | 128 | return invocationRequest;
|
|
0 commit comments