Skip to content

Commit 6a3ffd5

Browse files
authored
Cache JNI jClass jfieldID lookups (#314)
Cache jni fields Co-authored-by: Carl Zogheib <[email protected]>
1 parent 3677d0c commit 6a3ffd5

File tree

4 files changed

+50
-22
lines changed

4 files changed

+50
-22
lines changed

.gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,7 @@ dependency-reduced-pom.xml
2121
.gradle
2222
.settings
2323
.classpath
24-
.project
24+
.project
25+
26+
# OSX
27+
.DS_Store

aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.glibc

+2-1
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,5 @@ RUN /usr/bin/c++ -c \
6969
-laws-lambda-runtime \
7070
-lcurl \
7171
-static-libstdc++ \
72-
-lrt
72+
-lrt \
73+
-O2

aws-lambda-java-runtime-interface-client/src/main/jni/Dockerfile.musl

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,5 @@ RUN /usr/bin/c++ -c \
5858
-laws-lambda-runtime \
5959
-lcurl \
6060
-static-libstdc++ \
61-
-static-libgcc
61+
-static-libgcc \
62+
-O2

aws-lambda-java-runtime-interface-client/src/main/jni/com_amazonaws_services_lambda_runtime_api_client_runtimeapi_NativeClient.cpp

+42-19
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,48 @@
2424

2525
static aws::lambda_runtime::runtime * CLIENT = nullptr;
2626

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+
2769
static void throwLambdaRuntimeClientException(JNIEnv *env, std::string message, aws::http::response_code responseCode){
2870
jclass lambdaRuntimeExceptionClass = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/LambdaRuntimeClientException");
2971
jstring jMessage = env->NewStringUTF(message.c_str());
@@ -56,50 +98,31 @@ JNIEXPORT jobject JNICALL Java_com_amazonaws_services_lambda_runtime_api_client_
5698
return NULL;
5799
}
58100

59-
jclass invocationRequestClass;
60-
jfieldID invokedFunctionArnField;
61-
jfieldID deadlineTimeInMsField;
62-
jfieldID xrayTraceIdField;
63-
jfieldID idField;
64101
jobject invocationRequest;
65-
jfieldID clientContextField;
66-
jfieldID cognitoIdentityField;
67102
jbyteArray jArray;
68103
const jbyte* bytes;
69-
jfieldID contentField;
70104
auto response = outcome.get_result();
71105

72-
CHECK_EXCEPTION(env, invocationRequestClass = env->FindClass("com/amazonaws/services/lambda/runtime/api/client/runtimeapi/InvocationRequest"));
73106
CHECK_EXCEPTION(env, invocationRequest = env->AllocObject(invocationRequestClass));
74-
75-
CHECK_EXCEPTION(env, idField = env->GetFieldID(invocationRequestClass , "id", "Ljava/lang/String;"));
76107
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;"));
79108
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"));
82109
CHECK_EXCEPTION(env, env->SetLongField(invocationRequest, deadlineTimeInMsField, std::chrono::duration_cast<std::chrono::milliseconds>(response.deadline.time_since_epoch()).count()));
83110

84111
if(response.xray_trace_id != ""){
85-
CHECK_EXCEPTION(env, xrayTraceIdField = env->GetFieldID(invocationRequestClass , "xrayTraceId", "Ljava/lang/String;"));
86112
CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, xrayTraceIdField, env->NewStringUTF(response.xray_trace_id.c_str())));
87113
}
88114

89115
if(response.client_context != ""){
90-
CHECK_EXCEPTION(env, clientContextField = env->GetFieldID(invocationRequestClass , "clientContext", "Ljava/lang/String;"));
91116
CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, clientContextField, env->NewStringUTF(response.client_context.c_str())));
92117
}
93118

94119
if(response.cognito_identity != ""){
95-
CHECK_EXCEPTION(env, cognitoIdentityField = env->GetFieldID(invocationRequestClass , "cognitoIdentity", "Ljava/lang/String;"));
96120
CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, cognitoIdentityField, env->NewStringUTF(response.cognito_identity.c_str())));
97121
}
98122

99123
bytes = reinterpret_cast<const jbyte*>(response.payload.c_str());
100124
CHECK_EXCEPTION(env, jArray = env->NewByteArray(response.payload.length()));
101125
CHECK_EXCEPTION(env, env->SetByteArrayRegion(jArray, 0, response.payload.length(), bytes));
102-
CHECK_EXCEPTION(env, contentField = env->GetFieldID(invocationRequestClass , "content", "[B"));
103126
CHECK_EXCEPTION(env, env->SetObjectField(invocationRequest, contentField, jArray));
104127

105128
return invocationRequest;

0 commit comments

Comments
 (0)