Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions bindings/java/ckzg_jni.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ void reset_trusted_setup(void) {
void throw_exception(JNIEnv *env, const char *message) {
jclass exception_class = (*env)->FindClass(env, "java/lang/RuntimeException");
(*env)->ThrowNew(env, exception_class, message);
(*env)->DeleteLocalRef(env, exception_class);
}

void throw_c_kzg_exception(JNIEnv *env, C_KZG_RET error_code,
Expand All @@ -31,6 +32,9 @@ void throw_c_kzg_exception(JNIEnv *env, C_KZG_RET error_code,
jobject exception = (*env)->NewObject(
env, exception_class, exception_constructor, error_code, error_message);
(*env)->Throw(env, exception);
(*env)->DeleteLocalRef(env, error_message);
(*env)->DeleteLocalRef(env, exception);
(*env)->DeleteLocalRef(env, exception_class);
}

void throw_invalid_size_exception(JNIEnv *env, const char *prefix, size_t size,
Expand Down Expand Up @@ -225,31 +229,44 @@ JNIEXPORT jobject JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_computeKzgProof(
(*env)->ReleaseByteArrayElements(env, z_bytes, (jbyte *)z_native, JNI_ABORT);

if (ret != C_KZG_OK) {
(*env)->DeleteLocalRef(env, proof);
(*env)->DeleteLocalRef(env, y);
throw_c_kzg_exception(env, ret, "There was an error in computeKzgProof.");
return NULL;
}

jclass proof_and_y_class =
(*env)->FindClass(env, "ethereum/ckzg4844/ProofAndY");
if (proof_and_y_class == NULL) {
(*env)->DeleteLocalRef(env, proof);
(*env)->DeleteLocalRef(env, y);
throw_exception(env, "Failed to find ProofAndY class.");
return NULL;
}

jmethodID proof_and_y_constructor =
(*env)->GetMethodID(env, proof_and_y_class, "<init>", "([B[B)V");
if (proof_and_y_constructor == NULL) {
(*env)->DeleteLocalRef(env, proof);
(*env)->DeleteLocalRef(env, y);
(*env)->DeleteLocalRef(env, proof_and_y_class);
throw_exception(env, "Failed to find ProofAndY constructor.");
return NULL;
}

jobject proof_and_y = (*env)->NewObject(env, proof_and_y_class,
proof_and_y_constructor, proof, y);
if (proof_and_y == NULL) {
(*env)->DeleteLocalRef(env, proof);
(*env)->DeleteLocalRef(env, y);
(*env)->DeleteLocalRef(env, proof_and_y_class);
throw_exception(env, "Failed to instantiate new ProofAndY.");
return NULL;
}

(*env)->DeleteLocalRef(env, proof_and_y_class);
(*env)->DeleteLocalRef(env, proof);
(*env)->DeleteLocalRef(env, y);
return proof_and_y;
}

Expand Down Expand Up @@ -293,6 +310,7 @@ Java_ethereum_ckzg4844_CKZG4844JNI_computeBlobKzgProof(
(*env)->ReleaseByteArrayElements(env, proof, (jbyte *)proof_native, 0);

if (ret != C_KZG_OK) {
(*env)->DeleteLocalRef(env, proof);
throw_c_kzg_exception(env, ret,
"There was an error in computeBlobKzgProof.");
return NULL;
Expand Down Expand Up @@ -511,6 +529,7 @@ JNIEXPORT jobject JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_computeCells(
(*env)->ReleaseByteArrayElements(env, blob, (jbyte *)blob_native, JNI_ABORT);

if (ret != C_KZG_OK) {
(*env)->DeleteLocalRef(env, cells);
throw_c_kzg_exception(env, ret, "There was an error in computeCells.");
return NULL;
}
Expand Down Expand Up @@ -554,6 +573,8 @@ Java_ethereum_ckzg4844_CKZG4844JNI_computeCellsAndKzgProofs(JNIEnv *env,
(*env)->ReleaseByteArrayElements(env, blob, (jbyte *)blob_native, JNI_ABORT);

if (ret != C_KZG_OK) {
(*env)->DeleteLocalRef(env, cells);
(*env)->DeleteLocalRef(env, proofs);
throw_c_kzg_exception(env, ret,
"There was an error in computeCellsAndKzgProofs.");
return NULL;
Expand All @@ -562,26 +583,35 @@ Java_ethereum_ckzg4844_CKZG4844JNI_computeCellsAndKzgProofs(JNIEnv *env,
jclass caps_class =
(*env)->FindClass(env, "ethereum/ckzg4844/CellsAndProofs");
if (caps_class == NULL) {
(*env)->DeleteLocalRef(env, cells);
(*env)->DeleteLocalRef(env, proofs);
throw_exception(env, "Failed to find CellsAndProofs class.");
return NULL;
}

jmethodID caps_constructor =
(*env)->GetMethodID(env, caps_class, "<init>", "([B[B)V");
if (caps_constructor == NULL) {
(*env)->DeleteLocalRef(env, cells);
(*env)->DeleteLocalRef(env, proofs);
(*env)->DeleteLocalRef(env, caps_class);
throw_exception(env, "Failed to find CellsAndProofs constructor.");
return NULL;
}

jobject result =
(*env)->NewObject(env, caps_class, caps_constructor, cells, proofs);
if (result == NULL) {
(*env)->DeleteLocalRef(env, cells);
(*env)->DeleteLocalRef(env, proofs);
(*env)->DeleteLocalRef(env, caps_class);
throw_exception(env, "Failed to instantiate CellsAndProofs object.");
return NULL;
}

(*env)->DeleteLocalRef(env, cells);
(*env)->DeleteLocalRef(env, proofs);
(*env)->DeleteLocalRef(env, caps_class);

return result;
}
Expand Down Expand Up @@ -628,6 +658,8 @@ Java_ethereum_ckzg4844_CKZG4844JNI_recoverCellsAndKzgProofs(
JNI_ABORT);

if (ret != C_KZG_OK) {
(*env)->DeleteLocalRef(env, recovered_cells);
(*env)->DeleteLocalRef(env, recovered_proofs);
throw_c_kzg_exception(env, ret,
"There was an error in recoverCellsAndKzgProofs.");
return NULL;
Expand All @@ -636,26 +668,35 @@ Java_ethereum_ckzg4844_CKZG4844JNI_recoverCellsAndKzgProofs(
jclass caps_class =
(*env)->FindClass(env, "ethereum/ckzg4844/CellsAndProofs");
if (caps_class == NULL) {
(*env)->DeleteLocalRef(env, recovered_cells);
(*env)->DeleteLocalRef(env, recovered_proofs);
throw_exception(env, "Failed to find CellsAndProofs class.");
return NULL;
}

jmethodID caps_constructor =
(*env)->GetMethodID(env, caps_class, "<init>", "([B[B)V");
if (caps_constructor == NULL) {
(*env)->DeleteLocalRef(env, recovered_cells);
(*env)->DeleteLocalRef(env, recovered_proofs);
(*env)->DeleteLocalRef(env, caps_class);
throw_exception(env, "Failed to find CellsAndProofs constructor.");
return NULL;
}

jobject result = (*env)->NewObject(env, caps_class, caps_constructor,
recovered_cells, recovered_proofs);
if (result == NULL) {
(*env)->DeleteLocalRef(env, recovered_cells);
(*env)->DeleteLocalRef(env, recovered_proofs);
(*env)->DeleteLocalRef(env, caps_class);
throw_exception(env, "Failed to instantiate CellsAndProof object.");
return NULL;
}

(*env)->DeleteLocalRef(env, recovered_cells);
(*env)->DeleteLocalRef(env, recovered_proofs);
(*env)->DeleteLocalRef(env, caps_class);

return result;
}
Expand Down
Loading