in sdk/host/src/main/native/cpp/platform/tee_sdk_svm/jni/jni_tee_sdk_svm.c [62:99]
enclave_calling_stub_result enclave_calling_entry(JNIEnv *env, jlong enclave_handler, jlong isolate_handler, jbyteArray payload, enclave_calling_stub stub) {
jbyte *payload_copy = (*env)->GetByteArrayElements(env, payload, NULL);
int payload_copy_length = (*env)->GetArrayLength(env, payload);
enc_data_t input;
input.data = (char*)payload_copy;
input.data_len = payload_copy_length;
enc_data_t output;
output.data = NULL;
output.data_len = 0x0;
jbyteArray invocation_result_array;
enclave_calling_stub_result result_wrapper;
result_wrapper.ret = 0;
result_wrapper.result = invocation_result_array;
stub(enclave_handler, &result_wrapper.ret, (graal_isolate_t*)isolate_handler, (void*)(input.data), (size_t)(input.data_len), (void*)(&(output.data)), (size_t*)(&(output.data_len)));
if (result_wrapper.ret != 0) {
(*env)->ReleaseByteArrayElements(env, payload, payload_copy, 0);
// free buffer malloc in native image by callback mechanism.
free(output.data);
return result_wrapper;
}
// create a byte array.
invocation_result_array = (*env)->NewByteArray(env, output.data_len);
jbyte *invocation_result_array_ptr = (*env)->GetByteArrayElements(env, invocation_result_array, NULL);
memcpy(invocation_result_array_ptr, output.data, (size_t)output.data_len);
(*env)->ReleaseByteArrayElements(env, payload, payload_copy, 0);
// free buffer malloc in jni.
(*env)->ReleaseByteArrayElements(env, invocation_result_array, invocation_result_array_ptr, 0);
// free buffer malloc in native image by callback mechanism.
free(output.data);
result_wrapper.result = invocation_result_array;
return result_wrapper;
}