From 764072bc9405b12986c874595f777e3027d6e9f9 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 18 Mar 2026 10:36:49 +0100 Subject: [PATCH 01/10] added attchment path --- .../main/java/io/sentry/ndk/INativeScope.java | 14 ++++++ .../main/java/io/sentry/ndk/NativeScope.java | 26 ++++++++++ ndk/lib/src/main/jni/sentry.c | 50 +++++++++++++++++++ 3 files changed, 90 insertions(+) diff --git a/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java b/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java index 97124c774b..fcb80397f7 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java @@ -1,5 +1,7 @@ package io.sentry.ndk; +import org.jetbrains.annotations.NotNull; + public interface INativeScope { void setTag(String key, String value); @@ -17,4 +19,16 @@ void addBreadcrumb( String level, String message, String category, String type, String timestamp, String data); void setTrace(String traceId, String parentSpanId); +<<<<<<< Updated upstream +||||||| Stash base + + void addAttachment(String path); + + void clearAttachments(); +======= + + void addAttachment(@NotNull String path); + + void clearAttachments(); +>>>>>>> Stashed changes } diff --git a/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java b/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java index a619624dea..4785c1e9f2 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java @@ -1,5 +1,7 @@ package io.sentry.ndk; +import org.jetbrains.annotations.NotNull; + public final class NativeScope implements INativeScope { public static native void nativeSetTag(String key, String value); @@ -63,4 +65,28 @@ public void addBreadcrumb( public void setTrace(String traceId, String parentSpanId) { nativeSetTrace(traceId, parentSpanId); } +<<<<<<< Updated upstream +||||||| Stash base + + @Override + public void addAttachment(String path) { + nativeAddAttachment(path); + } + + @Override + public void clearAttachments() { + nativeClearAttachments(); + } +======= + + @Override + public void addAttachment(@NotNull String path) { + nativeAddAttachment(path); + } + + @Override + public void clearAttachments() { + nativeClearAttachments(); + } +>>>>>>> Stashed changes } diff --git a/ndk/lib/src/main/jni/sentry.c b/ndk/lib/src/main/jni/sentry.c index 6be3765c39..57bee06f73 100644 --- a/ndk/lib/src/main/jni/sentry.c +++ b/ndk/lib/src/main/jni/sentry.c @@ -227,6 +227,56 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( sentry_add_breadcrumb(crumb); } +<<<<<<< Updated upstream +||||||| Stash base +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeAddAttachment( + JNIEnv *env, + jclass cls, + jstring path) { + const char *charPath = (*env)->GetStringUTFChars(env, path, 0); + + // The returned sentry_attachment_t* is intentionally discarded. + // Tracking it across the JNI boundary for individual removal is not + // worth the complexity. Use sentry_clear_attachments() for bulk removal. + sentry_attach_file(charPath); + + (*env)->ReleaseStringUTFChars(env, path, charPath); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { + sentry_clear_attachments(); +} + +======= +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeAddAttachment( + JNIEnv *env, + jclass cls, + jstring path) { + if (!path) { + return; + } + const char *charPath = (*env)->GetStringUTFChars(env, path, 0); + if (!charPath) { + return; + } + + // The returned sentry_attachment_t* is intentionally discarded. + // Tracking it across the JNI boundary for individual removal is not + // worth the complexity. Use sentry_clear_attachments() for bulk removal. + sentry_attach_file(charPath); + + (*env)->ReleaseStringUTFChars(env, path, charPath); +} + +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { + sentry_clear_attachments(); +} + +>>>>>>> Stashed changes static void send_envelope(sentry_envelope_t *envelope, void *data) { const char *outbox_path = (const char *) data; char envelope_id_str[40]; From 5bab70bbdd069a41a1062376e4af34296ddb9f9c Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 18 Mar 2026 10:48:51 +0100 Subject: [PATCH 02/10] stash markers --- .../main/java/io/sentry/ndk/INativeScope.java | 8 ------- .../main/java/io/sentry/ndk/NativeScope.java | 18 ++++---------- ndk/lib/src/main/jni/sentry.c | 24 ------------------- 3 files changed, 4 insertions(+), 46 deletions(-) diff --git a/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java b/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java index fcb80397f7..54b9bd539d 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java @@ -19,16 +19,8 @@ void addBreadcrumb( String level, String message, String category, String type, String timestamp, String data); void setTrace(String traceId, String parentSpanId); -<<<<<<< Updated upstream -||||||| Stash base - - void addAttachment(String path); - - void clearAttachments(); -======= void addAttachment(@NotNull String path); void clearAttachments(); ->>>>>>> Stashed changes } diff --git a/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java b/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java index 4785c1e9f2..cf3ce363ba 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java @@ -21,6 +21,10 @@ public static native void nativeAddBreadcrumb( public static native void nativeSetTrace(String traceId, String parentSpanId); + public static native void nativeAddAttachment(@NotNull String path); + + public static native void nativeClearAttachments(); + @Override public void setTag(String key, String value) { nativeSetTag(key, value); @@ -65,19 +69,6 @@ public void addBreadcrumb( public void setTrace(String traceId, String parentSpanId) { nativeSetTrace(traceId, parentSpanId); } -<<<<<<< Updated upstream -||||||| Stash base - - @Override - public void addAttachment(String path) { - nativeAddAttachment(path); - } - - @Override - public void clearAttachments() { - nativeClearAttachments(); - } -======= @Override public void addAttachment(@NotNull String path) { @@ -88,5 +79,4 @@ public void addAttachment(@NotNull String path) { public void clearAttachments() { nativeClearAttachments(); } ->>>>>>> Stashed changes } diff --git a/ndk/lib/src/main/jni/sentry.c b/ndk/lib/src/main/jni/sentry.c index 57bee06f73..9cd9478772 100644 --- a/ndk/lib/src/main/jni/sentry.c +++ b/ndk/lib/src/main/jni/sentry.c @@ -227,29 +227,6 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( sentry_add_breadcrumb(crumb); } -<<<<<<< Updated upstream -||||||| Stash base -JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeAddAttachment( - JNIEnv *env, - jclass cls, - jstring path) { - const char *charPath = (*env)->GetStringUTFChars(env, path, 0); - - // The returned sentry_attachment_t* is intentionally discarded. - // Tracking it across the JNI boundary for individual removal is not - // worth the complexity. Use sentry_clear_attachments() for bulk removal. - sentry_attach_file(charPath); - - (*env)->ReleaseStringUTFChars(env, path, charPath); -} - -JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { - sentry_clear_attachments(); -} - -======= JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeAddAttachment( JNIEnv *env, @@ -276,7 +253,6 @@ Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { sentry_clear_attachments(); } ->>>>>>> Stashed changes static void send_envelope(sentry_envelope_t *envelope, void *data) { const char *outbox_path = (const char *) data; char envelope_id_str[40]; From 6ffd885a9a7e6bde9aa67b1c4d541f1ff0e2cd3f Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 18 Mar 2026 12:11:50 +0100 Subject: [PATCH 03/10] cleanup --- .../main/java/io/sentry/ndk/INativeScope.java | 4 +- .../main/java/io/sentry/ndk/NativeScope.java | 6 +- ndk/lib/src/main/jni/sentry.c | 292 ++++++++++-------- 3 files changed, 167 insertions(+), 135 deletions(-) diff --git a/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java b/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java index 54b9bd539d..16570c09ca 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java @@ -1,7 +1,5 @@ package io.sentry.ndk; -import org.jetbrains.annotations.NotNull; - public interface INativeScope { void setTag(String key, String value); @@ -20,7 +18,7 @@ void addBreadcrumb( void setTrace(String traceId, String parentSpanId); - void addAttachment(@NotNull String path); + void addAttachment(String path); void clearAttachments(); } diff --git a/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java b/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java index cf3ce363ba..d5fa50fbce 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java @@ -1,7 +1,5 @@ package io.sentry.ndk; -import org.jetbrains.annotations.NotNull; - public final class NativeScope implements INativeScope { public static native void nativeSetTag(String key, String value); @@ -21,7 +19,7 @@ public static native void nativeAddBreadcrumb( public static native void nativeSetTrace(String traceId, String parentSpanId); - public static native void nativeAddAttachment(@NotNull String path); + public static native void nativeAddAttachment(String path); public static native void nativeClearAttachments(); @@ -71,7 +69,7 @@ public void setTrace(String traceId, String parentSpanId) { } @Override - public void addAttachment(@NotNull String path) { + public void addAttachment(String path) { nativeAddAttachment(path); } diff --git a/ndk/lib/src/main/jni/sentry.c b/ndk/lib/src/main/jni/sentry.c index 9cd9478772..a27f652d47 100644 --- a/ndk/lib/src/main/jni/sentry.c +++ b/ndk/lib/src/main/jni/sentry.c @@ -1,20 +1,22 @@ -#include +#include +#include #include #include -#include -#include +#include -#define ENSURE(Expr) \ - if (!(Expr)) \ - return +#define ENSURE(Expr) \ + if (!(Expr)) \ + return -#define ENSURE_OR_FAIL(Expr) \ - if (!(Expr)) \ - goto fail +#define ENSURE_OR_FAIL(Expr) \ + if (!(Expr)) \ + goto fail -static bool get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) { +static bool +get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) +{ jsize utf_len = (*env)->GetStringUTFLength(env, jstr); - if ((size_t) utf_len >= buf_len) { + if ((size_t)utf_len >= buf_len) { return false; } @@ -29,11 +31,13 @@ static bool get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len return true; } -static char *get_string(JNIEnv *env, jstring jstr) { +static char * +get_string(JNIEnv *env, jstring jstr) +{ char *buf = NULL; jsize utf_len = (*env)->GetStringUTFLength(env, jstr); - size_t buf_len = (size_t) utf_len + 1; + size_t buf_len = (size_t)utf_len + 1; buf = sentry_malloc(buf_len); ENSURE_OR_FAIL(buf); @@ -41,30 +45,30 @@ static char *get_string(JNIEnv *env, jstring jstr) { return buf; - fail: +fail: sentry_free(buf); return NULL; } -static char *call_get_string(JNIEnv *env, jobject obj, jmethodID mid) { - jstring j_str = (jstring) (*env)->CallObjectMethod(env, obj, mid); +static char * +call_get_string(JNIEnv *env, jobject obj, jmethodID mid) +{ + jstring j_str = (jstring)(*env)->CallObjectMethod(env, obj, mid); ENSURE_OR_FAIL(j_str); char *str = get_string(env, j_str); (*env)->DeleteLocalRef(env, j_str); return str; - fail: +fail: return NULL; } JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetTag( - JNIEnv *env, - jclass cls, - jstring key, - jstring value) { + JNIEnv *env, jclass cls, jstring key, jstring value) +{ const char *charKey = (*env)->GetStringUTFChars(env, key, 0); const char *charValue = (*env)->GetStringUTFChars(env, value, 0); @@ -75,7 +79,9 @@ Java_io_sentry_ndk_NativeScope_nativeSetTag( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveTag(JNIEnv *env, jclass cls, jstring key) { +Java_io_sentry_ndk_NativeScope_nativeRemoveTag( + JNIEnv *env, jclass cls, jstring key) +{ const char *charKey = (*env)->GetStringUTFChars(env, key, 0); sentry_remove_tag(charKey); @@ -85,10 +91,8 @@ Java_io_sentry_ndk_NativeScope_nativeRemoveTag(JNIEnv *env, jclass cls, jstring JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetExtra( - JNIEnv *env, - jclass cls, - jstring key, - jstring value) { + JNIEnv *env, jclass cls, jstring key, jstring value) +{ const char *charKey = (*env)->GetStringUTFChars(env, key, 0); const char *charValue = (*env)->GetStringUTFChars(env, value, 0); @@ -100,7 +104,9 @@ Java_io_sentry_ndk_NativeScope_nativeSetExtra( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveExtra(JNIEnv *env, jclass cls, jstring key) { +Java_io_sentry_ndk_NativeScope_nativeRemoveExtra( + JNIEnv *env, jclass cls, jstring key) +{ const char *charKey = (*env)->GetStringUTFChars(env, key, 0); sentry_remove_extra(charKey); @@ -109,13 +115,9 @@ Java_io_sentry_ndk_NativeScope_nativeRemoveExtra(JNIEnv *env, jclass cls, jstrin } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeSetUser( - JNIEnv *env, - jclass cls, - jstring id, - jstring email, - jstring ipAddress, - jstring username) { +Java_io_sentry_ndk_NativeScope_nativeSetUser(JNIEnv *env, jclass cls, + jstring id, jstring email, jstring ipAddress, jstring username) +{ sentry_value_t user = sentry_value_new_object(); if (id) { const char *charId = (*env)->GetStringUTFChars(env, id, 0); @@ -125,32 +127,35 @@ Java_io_sentry_ndk_NativeScope_nativeSetUser( if (email) { const char *charEmail = (*env)->GetStringUTFChars(env, email, 0); sentry_value_set_by_key( - user, "email", sentry_value_new_string(charEmail)); + user, "email", sentry_value_new_string(charEmail)); (*env)->ReleaseStringUTFChars(env, email, charEmail); } if (ipAddress) { - const char *charIpAddress = (*env)->GetStringUTFChars(env, ipAddress, 0); + const char *charIpAddress + = (*env)->GetStringUTFChars(env, ipAddress, 0); sentry_value_set_by_key( - user, "ip_address", sentry_value_new_string(charIpAddress)); + user, "ip_address", sentry_value_new_string(charIpAddress)); (*env)->ReleaseStringUTFChars(env, ipAddress, charIpAddress); } if (username) { const char *charUsername = (*env)->GetStringUTFChars(env, username, 0); sentry_value_set_by_key( - user, "username", sentry_value_new_string(charUsername)); + user, "username", sentry_value_new_string(charUsername)); (*env)->ReleaseStringUTFChars(env, username, charUsername); } sentry_set_user(user); } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) +{ sentry_remove_user(); } JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetTrace( - JNIEnv *env, jclass cls, jstring trace_id, jstring parent_span_id) { + JNIEnv *env, jclass cls, jstring trace_id, jstring parent_span_id) +{ const char *charTraceId = (*env)->GetStringUTFChars(env, trace_id, 0); const char *charParentSpanId = (*env)->GetStringUTFChars(env, parent_span_id, 0); @@ -162,15 +167,10 @@ Java_io_sentry_ndk_NativeScope_nativeSetTrace( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( - JNIEnv *env, - jclass cls, - jstring level, - jstring message, - jstring category, - jstring type, - jstring timestamp, - jstring data) { +Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, + jstring level, jstring message, jstring category, jstring type, + jstring timestamp, jstring data) +{ if (!level && !message && !category && !type) { return; } @@ -194,21 +194,23 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( if (category) { const char *charCategory = (*env)->GetStringUTFChars(env, category, 0); sentry_value_set_by_key( - crumb, "category", sentry_value_new_string(charCategory)); + crumb, "category", sentry_value_new_string(charCategory)); (*env)->ReleaseStringUTFChars(env, category, charCategory); } if (level) { const char *charLevel = (*env)->GetStringUTFChars(env, level, 0); sentry_value_set_by_key( - crumb, "level", sentry_value_new_string(charLevel)); + crumb, "level", sentry_value_new_string(charLevel)); (*env)->ReleaseStringUTFChars(env, level, charLevel); } if (timestamp) { - // overwrite timestamp that is already created on sentry_value_new_breadcrumb - const char *charTimestamp = (*env)->GetStringUTFChars(env, timestamp, 0); + // overwrite timestamp that is already created on + // sentry_value_new_breadcrumb + const char *charTimestamp + = (*env)->GetStringUTFChars(env, timestamp, 0); sentry_value_set_by_key( - crumb, "timestamp", sentry_value_new_string(charTimestamp)); + crumb, "timestamp", sentry_value_new_string(charTimestamp)); (*env)->ReleaseStringUTFChars(env, timestamp, charTimestamp); } @@ -217,7 +219,8 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( // we create an object because the Java layer parses it as a Map sentry_value_t dataObject = sentry_value_new_object(); - sentry_value_set_by_key(dataObject, "data", sentry_value_new_string(charData)); + sentry_value_set_by_key( + dataObject, "data", sentry_value_new_string(charData)); sentry_value_set_by_key(crumb, "data", dataObject); @@ -229,9 +232,8 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeAddAttachment( - JNIEnv *env, - jclass cls, - jstring path) { + JNIEnv *env, jclass cls, jstring path) +{ if (!path) { return; } @@ -241,20 +243,23 @@ Java_io_sentry_ndk_NativeScope_nativeAddAttachment( } // The returned sentry_attachment_t* is intentionally discarded. - // Tracking it across the JNI boundary for individual removal is not - // worth the complexity. Use sentry_clear_attachments() for bulk removal. + // We are not tracking it across the JNI boundary for individual removals. + // Use sentry_clear_attachments() for bulk removal. sentry_attach_file(charPath); (*env)->ReleaseStringUTFChars(env, path, charPath); } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) +{ sentry_clear_attachments(); } -static void send_envelope(sentry_envelope_t *envelope, void *data) { - const char *outbox_path = (const char *) data; +static void +send_envelope(sentry_envelope_t *envelope, void *data) +{ + const char *outbox_path = (const char *)data; char envelope_id_str[40]; sentry_uuid_t envelope_id = sentry_uuid_new_v4(); @@ -264,7 +269,8 @@ static void send_envelope(sentry_envelope_t *envelope, void *data) { size_t final_len = outbox_len + 42; // "/" + envelope_id_str + "\0" = 42 char *envelope_path = sentry_malloc(final_len); ENSURE(envelope_path); - int written = snprintf(envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); + int written = snprintf( + envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); if (written > outbox_len && written < final_len) { sentry_envelope_write_to_file(envelope, envelope_path); } @@ -275,26 +281,31 @@ static void send_envelope(sentry_envelope_t *envelope, void *data) { JNIEXPORT jint JNICALL Java_io_sentry_ndk_SentryNdk_initSentryNative( - JNIEnv *env, - jclass cls, - jobject sentry_ndk_options) { + JNIEnv *env, jclass cls, jobject sentry_ndk_options) +{ jclass options_cls = (*env)->GetObjectClass(env, sentry_ndk_options); - jmethodID outbox_path_mid = (*env)->GetMethodID(env, options_cls, "getOutboxPath", - "()Ljava/lang/String;"); - jmethodID dsn_mid = (*env)->GetMethodID(env, options_cls, "getDsn", "()Ljava/lang/String;"); - jmethodID is_debug_mid = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); - jmethodID release_mid = (*env)->GetMethodID(env, options_cls, "getRelease", - "()Ljava/lang/String;"); - jmethodID environment_mid = (*env)->GetMethodID(env, options_cls, "getEnvironment", - "()Ljava/lang/String;"); - jmethodID dist_mid = (*env)->GetMethodID(env, options_cls, "getDist", "()Ljava/lang/String;"); - jmethodID max_crumbs_mid = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); - jmethodID native_sdk_name_mid = (*env)->GetMethodID(env, options_cls, "getSdkName", - "()Ljava/lang/String;"); - - jmethodID handler_strategy_mid = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); - - jmethodID traces_sample_rate_mid = (*env)->GetMethodID(env, options_cls, "getTracesSampleRate", "()F"); + jmethodID outbox_path_mid = (*env)->GetMethodID( + env, options_cls, "getOutboxPath", "()Ljava/lang/String;"); + jmethodID dsn_mid = (*env)->GetMethodID( + env, options_cls, "getDsn", "()Ljava/lang/String;"); + jmethodID is_debug_mid + = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); + jmethodID release_mid = (*env)->GetMethodID( + env, options_cls, "getRelease", "()Ljava/lang/String;"); + jmethodID environment_mid = (*env)->GetMethodID( + env, options_cls, "getEnvironment", "()Ljava/lang/String;"); + jmethodID dist_mid = (*env)->GetMethodID( + env, options_cls, "getDist", "()Ljava/lang/String;"); + jmethodID max_crumbs_mid + = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); + jmethodID native_sdk_name_mid = (*env)->GetMethodID( + env, options_cls, "getSdkName", "()Ljava/lang/String;"); + + jmethodID handler_strategy_mid + = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); + + jmethodID traces_sample_rate_mid + = (*env)->GetMethodID(env, options_cls, "getTracesSampleRate", "()F"); (*env)->DeleteLocalRef(env, options_cls); @@ -312,13 +323,16 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( options = sentry_options_new(); ENSURE_OR_FAIL(options); - // session tracking is enabled by default, but the Android SDK already handles it + // session tracking is enabled by default, but the Android SDK already + // handles it sentry_options_set_auto_session_tracking(options, 0); - jboolean debug = (jboolean) (*env)->CallBooleanMethod(env, sentry_ndk_options, is_debug_mid); + jboolean debug = (jboolean)(*env)->CallBooleanMethod( + env, sentry_ndk_options, is_debug_mid); sentry_options_set_debug(options, debug); - jint max_crumbs = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); + jint max_crumbs + = (jint)(*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); sentry_options_set_max_breadcrumbs(options, max_crumbs); outbox_path = call_get_string(env, sentry_ndk_options, outbox_path_mid); @@ -333,7 +347,8 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_options_set_transport(options, transport); options_owns_transport = true; - // give sentry-native its own database path it can work with, next to the outbox + // give sentry-native its own database path it can work with, next to the + // outbox size_t outbox_len = strlen(outbox_path); size_t final_len = outbox_len + 15; // len(".sentry-native\0") = 15 char *database_path = sentry_malloc(final_len); @@ -341,7 +356,8 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( strncpy(database_path, outbox_path, final_len); char *dir = strrchr(database_path, '/'); if (dir) { - strncpy(dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); + strncpy( + dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); } sentry_options_set_database_path(options, database_path); sentry_free(database_path); @@ -369,22 +385,25 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_free(dist_str); } - native_sdk_name_str = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); + native_sdk_name_str + = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); if (native_sdk_name_str) { sentry_options_set_sdk_name(options, native_sdk_name_str); sentry_free(native_sdk_name_str); } - jint handler_strategy = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, handler_strategy_mid); + jint handler_strategy = (jint)(*env)->CallIntMethod( + env, sentry_ndk_options, handler_strategy_mid); sentry_options_set_handler_strategy(options, handler_strategy); - jfloat traces_sample_rate = (jfloat) (*env)->CallFloatMethod(env, sentry_ndk_options, traces_sample_rate_mid); + jfloat traces_sample_rate = (jfloat)(*env)->CallFloatMethod( + env, sentry_ndk_options, traces_sample_rate_mid); sentry_options_set_traces_sample_rate(options, traces_sample_rate); int rv = sentry_init(options); - return (jint) rv; + return (jint)rv; - fail: +fail: if (!transport_owns_path) { sentry_free(outbox_path); } @@ -392,16 +411,20 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_transport_free(transport); } sentry_options_free(options); - return (jint) -1; + return (jint)-1; } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList( + JNIEnv *env, jclass cls) +{ sentry_clear_modulecache(); } JNIEXPORT jobjectArray JNICALL -Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( + JNIEnv *env, jclass cls) +{ sentry_value_t image_list_t = sentry_get_modules_list(); jobjectArray image_list = NULL; @@ -411,61 +434,68 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla jclass image_class = (*env)->FindClass(env, "io/sentry/ndk/DebugImage"); image_list = (*env)->NewObjectArray(env, len_t, image_class, NULL); - jmethodID image_addr_method = (*env)->GetMethodID(env, image_class, "setImageAddr", - "(Ljava/lang/String;)V"); + jmethodID image_addr_method = (*env)->GetMethodID( + env, image_class, "setImageAddr", "(Ljava/lang/String;)V"); - jmethodID image_size_method = (*env)->GetMethodID(env, image_class, "setImageSize", - "(J)V"); + jmethodID image_size_method + = (*env)->GetMethodID(env, image_class, "setImageSize", "(J)V"); - jmethodID code_file_method = (*env)->GetMethodID(env, image_class, "setCodeFile", - "(Ljava/lang/String;)V"); + jmethodID code_file_method = (*env)->GetMethodID( + env, image_class, "setCodeFile", "(Ljava/lang/String;)V"); - jmethodID image_addr_ctor = (*env)->GetMethodID(env, image_class, "", - "()V"); + jmethodID image_addr_ctor + = (*env)->GetMethodID(env, image_class, "", "()V"); - jmethodID type_method = (*env)->GetMethodID(env, image_class, "setType", - "(Ljava/lang/String;)V"); + jmethodID type_method = (*env)->GetMethodID( + env, image_class, "setType", "(Ljava/lang/String;)V"); - jmethodID debug_id_method = (*env)->GetMethodID(env, image_class, "setDebugId", - "(Ljava/lang/String;)V"); + jmethodID debug_id_method = (*env)->GetMethodID( + env, image_class, "setDebugId", "(Ljava/lang/String;)V"); - jmethodID code_id_method = (*env)->GetMethodID(env, image_class, "setCodeId", - "(Ljava/lang/String;)V"); + jmethodID code_id_method = (*env)->GetMethodID( + env, image_class, "setCodeId", "(Ljava/lang/String;)V"); - jmethodID debug_file_method = (*env)->GetMethodID(env, image_class, "setDebugFile", - "(Ljava/lang/String;)V"); + jmethodID debug_file_method = (*env)->GetMethodID( + env, image_class, "setDebugFile", "(Ljava/lang/String;)V"); for (size_t i = 0; i < len_t; i++) { sentry_value_t image_t = sentry_value_get_by_index(image_list_t, i); if (!sentry_value_is_null(image_t)) { - jobject image = (*env)->NewObject(env, image_class, image_addr_ctor); + jobject image + = (*env)->NewObject(env, image_class, image_addr_ctor); - sentry_value_t image_addr_t = sentry_value_get_by_key(image_t, "image_addr"); + sentry_value_t image_addr_t + = sentry_value_get_by_key(image_t, "image_addr"); if (!sentry_value_is_null(image_addr_t)) { const char *value_v = sentry_value_as_string(image_addr_t); jstring value = (*env)->NewStringUTF(env, value_v); - (*env)->CallVoidMethod(env, image, image_addr_method, value); + (*env)->CallVoidMethod( + env, image, image_addr_method, value); - // Local refs (eg NewStringUTF) are freed automatically when the native method - // returns, but if you're iterating a large array, it's recommended to release - // manually due to allocation limits (512) on Android < 8 or OOM. + // Local refs (eg NewStringUTF) are freed automatically when + // the native method returns, but if you're iterating a + // large array, it's recommended to release manually due to + // allocation limits (512) on Android < 8 or OOM. // https://developer.android.com/training/articles/perf-jni.html#local-and-global-references (*env)->DeleteLocalRef(env, value); } - sentry_value_t image_size_t = sentry_value_get_by_key(image_t, "image_size"); + sentry_value_t image_size_t + = sentry_value_get_by_key(image_t, "image_size"); if (!sentry_value_is_null(image_size_t)) { int32_t value_v = sentry_value_as_int32(image_size_t); - jlong value = (jlong) value_v; + jlong value = (jlong)value_v; - (*env)->CallVoidMethod(env, image, image_size_method, value); + (*env)->CallVoidMethod( + env, image, image_size_method, value); } - sentry_value_t code_file_t = sentry_value_get_by_key(image_t, "code_file"); + sentry_value_t code_file_t + = sentry_value_get_by_key(image_t, "code_file"); if (!sentry_value_is_null(code_file_t)) { const char *value_v = sentry_value_as_string(code_file_t); @@ -476,7 +506,8 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla (*env)->DeleteLocalRef(env, value); } - sentry_value_t code_type_t = sentry_value_get_by_key(image_t, "type"); + sentry_value_t code_type_t + = sentry_value_get_by_key(image_t, "type"); if (!sentry_value_is_null(code_type_t)) { const char *value_v = sentry_value_as_string(code_type_t); @@ -487,7 +518,8 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla (*env)->DeleteLocalRef(env, value); } - sentry_value_t debug_id_t = sentry_value_get_by_key(image_t, "debug_id"); + sentry_value_t debug_id_t + = sentry_value_get_by_key(image_t, "debug_id"); if (!sentry_value_is_null(code_type_t)) { const char *value_v = sentry_value_as_string(debug_id_t); @@ -498,7 +530,8 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla (*env)->DeleteLocalRef(env, value); } - sentry_value_t code_id_t = sentry_value_get_by_key(image_t, "code_id"); + sentry_value_t code_id_t + = sentry_value_get_by_key(image_t, "code_id"); if (!sentry_value_is_null(code_id_t)) { const char *value_v = sentry_value_as_string(code_id_t); @@ -510,13 +543,15 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla } // not needed on Android, but keeping for forward compatibility - sentry_value_t debug_file_t = sentry_value_get_by_key(image_t, "debug_file"); + sentry_value_t debug_file_t + = sentry_value_get_by_key(image_t, "debug_file"); if (!sentry_value_is_null(debug_file_t)) { const char *value_v = sentry_value_as_string(debug_file_t); jstring value = (*env)->NewStringUTF(env, value_v); - (*env)->CallVoidMethod(env, image, debug_file_method, value); + (*env)->CallVoidMethod( + env, image, debug_file_method, value); (*env)->DeleteLocalRef(env, value); } @@ -534,6 +569,7 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla } JNIEXPORT void JNICALL -Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) +{ sentry_close(); } From 18bda25535a42a33a23fa19d8c2ba84d1412ba4e Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 18 Mar 2026 13:06:04 +0100 Subject: [PATCH 04/10] reverted formatting --- ndk/lib/src/main/jni/sentry.c | 288 +++++++++++++++------------------- 1 file changed, 126 insertions(+), 162 deletions(-) diff --git a/ndk/lib/src/main/jni/sentry.c b/ndk/lib/src/main/jni/sentry.c index a27f652d47..3786a1441a 100644 --- a/ndk/lib/src/main/jni/sentry.c +++ b/ndk/lib/src/main/jni/sentry.c @@ -1,22 +1,20 @@ -#include -#include +#include #include #include -#include +#include +#include -#define ENSURE(Expr) \ - if (!(Expr)) \ - return +#define ENSURE(Expr) \ + if (!(Expr)) \ + return -#define ENSURE_OR_FAIL(Expr) \ - if (!(Expr)) \ - goto fail +#define ENSURE_OR_FAIL(Expr) \ + if (!(Expr)) \ + goto fail -static bool -get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) -{ +static bool get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) { jsize utf_len = (*env)->GetStringUTFLength(env, jstr); - if ((size_t)utf_len >= buf_len) { + if ((size_t) utf_len >= buf_len) { return false; } @@ -31,13 +29,11 @@ get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) return true; } -static char * -get_string(JNIEnv *env, jstring jstr) -{ +static char *get_string(JNIEnv *env, jstring jstr) { char *buf = NULL; jsize utf_len = (*env)->GetStringUTFLength(env, jstr); - size_t buf_len = (size_t)utf_len + 1; + size_t buf_len = (size_t) utf_len + 1; buf = sentry_malloc(buf_len); ENSURE_OR_FAIL(buf); @@ -45,30 +41,30 @@ get_string(JNIEnv *env, jstring jstr) return buf; -fail: + fail: sentry_free(buf); return NULL; } -static char * -call_get_string(JNIEnv *env, jobject obj, jmethodID mid) -{ - jstring j_str = (jstring)(*env)->CallObjectMethod(env, obj, mid); +static char *call_get_string(JNIEnv *env, jobject obj, jmethodID mid) { + jstring j_str = (jstring) (*env)->CallObjectMethod(env, obj, mid); ENSURE_OR_FAIL(j_str); char *str = get_string(env, j_str); (*env)->DeleteLocalRef(env, j_str); return str; -fail: + fail: return NULL; } JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetTag( - JNIEnv *env, jclass cls, jstring key, jstring value) -{ + JNIEnv *env, + jclass cls, + jstring key, + jstring value) { const char *charKey = (*env)->GetStringUTFChars(env, key, 0); const char *charValue = (*env)->GetStringUTFChars(env, value, 0); @@ -79,9 +75,7 @@ Java_io_sentry_ndk_NativeScope_nativeSetTag( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveTag( - JNIEnv *env, jclass cls, jstring key) -{ +Java_io_sentry_ndk_NativeScope_nativeRemoveTag(JNIEnv *env, jclass cls, jstring key) { const char *charKey = (*env)->GetStringUTFChars(env, key, 0); sentry_remove_tag(charKey); @@ -91,8 +85,10 @@ Java_io_sentry_ndk_NativeScope_nativeRemoveTag( JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetExtra( - JNIEnv *env, jclass cls, jstring key, jstring value) -{ + JNIEnv *env, + jclass cls, + jstring key, + jstring value) { const char *charKey = (*env)->GetStringUTFChars(env, key, 0); const char *charValue = (*env)->GetStringUTFChars(env, value, 0); @@ -104,9 +100,7 @@ Java_io_sentry_ndk_NativeScope_nativeSetExtra( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveExtra( - JNIEnv *env, jclass cls, jstring key) -{ +Java_io_sentry_ndk_NativeScope_nativeRemoveExtra(JNIEnv *env, jclass cls, jstring key) { const char *charKey = (*env)->GetStringUTFChars(env, key, 0); sentry_remove_extra(charKey); @@ -115,9 +109,13 @@ Java_io_sentry_ndk_NativeScope_nativeRemoveExtra( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeSetUser(JNIEnv *env, jclass cls, - jstring id, jstring email, jstring ipAddress, jstring username) -{ +Java_io_sentry_ndk_NativeScope_nativeSetUser( + JNIEnv *env, + jclass cls, + jstring id, + jstring email, + jstring ipAddress, + jstring username) { sentry_value_t user = sentry_value_new_object(); if (id) { const char *charId = (*env)->GetStringUTFChars(env, id, 0); @@ -127,35 +125,32 @@ Java_io_sentry_ndk_NativeScope_nativeSetUser(JNIEnv *env, jclass cls, if (email) { const char *charEmail = (*env)->GetStringUTFChars(env, email, 0); sentry_value_set_by_key( - user, "email", sentry_value_new_string(charEmail)); + user, "email", sentry_value_new_string(charEmail)); (*env)->ReleaseStringUTFChars(env, email, charEmail); } if (ipAddress) { - const char *charIpAddress - = (*env)->GetStringUTFChars(env, ipAddress, 0); + const char *charIpAddress = (*env)->GetStringUTFChars(env, ipAddress, 0); sentry_value_set_by_key( - user, "ip_address", sentry_value_new_string(charIpAddress)); + user, "ip_address", sentry_value_new_string(charIpAddress)); (*env)->ReleaseStringUTFChars(env, ipAddress, charIpAddress); } if (username) { const char *charUsername = (*env)->GetStringUTFChars(env, username, 0); sentry_value_set_by_key( - user, "username", sentry_value_new_string(charUsername)); + user, "username", sentry_value_new_string(charUsername)); (*env)->ReleaseStringUTFChars(env, username, charUsername); } sentry_set_user(user); } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) { sentry_remove_user(); } JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetTrace( - JNIEnv *env, jclass cls, jstring trace_id, jstring parent_span_id) -{ + JNIEnv *env, jclass cls, jstring trace_id, jstring parent_span_id) { const char *charTraceId = (*env)->GetStringUTFChars(env, trace_id, 0); const char *charParentSpanId = (*env)->GetStringUTFChars(env, parent_span_id, 0); @@ -167,10 +162,15 @@ Java_io_sentry_ndk_NativeScope_nativeSetTrace( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, - jstring level, jstring message, jstring category, jstring type, - jstring timestamp, jstring data) -{ +Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( + JNIEnv *env, + jclass cls, + jstring level, + jstring message, + jstring category, + jstring type, + jstring timestamp, + jstring data) { if (!level && !message && !category && !type) { return; } @@ -194,23 +194,21 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, if (category) { const char *charCategory = (*env)->GetStringUTFChars(env, category, 0); sentry_value_set_by_key( - crumb, "category", sentry_value_new_string(charCategory)); + crumb, "category", sentry_value_new_string(charCategory)); (*env)->ReleaseStringUTFChars(env, category, charCategory); } if (level) { const char *charLevel = (*env)->GetStringUTFChars(env, level, 0); sentry_value_set_by_key( - crumb, "level", sentry_value_new_string(charLevel)); + crumb, "level", sentry_value_new_string(charLevel)); (*env)->ReleaseStringUTFChars(env, level, charLevel); } if (timestamp) { - // overwrite timestamp that is already created on - // sentry_value_new_breadcrumb - const char *charTimestamp - = (*env)->GetStringUTFChars(env, timestamp, 0); + // overwrite timestamp that is already created on sentry_value_new_breadcrumb + const char *charTimestamp = (*env)->GetStringUTFChars(env, timestamp, 0); sentry_value_set_by_key( - crumb, "timestamp", sentry_value_new_string(charTimestamp)); + crumb, "timestamp", sentry_value_new_string(charTimestamp)); (*env)->ReleaseStringUTFChars(env, timestamp, charTimestamp); } @@ -219,8 +217,7 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, // we create an object because the Java layer parses it as a Map sentry_value_t dataObject = sentry_value_new_object(); - sentry_value_set_by_key( - dataObject, "data", sentry_value_new_string(charData)); + sentry_value_set_by_key(dataObject, "data", sentry_value_new_string(charData)); sentry_value_set_by_key(crumb, "data", dataObject); @@ -232,8 +229,9 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeAddAttachment( - JNIEnv *env, jclass cls, jstring path) -{ + JNIEnv *env, + jclass cls, + jstring path) { if (!path) { return; } @@ -251,15 +249,12 @@ Java_io_sentry_ndk_NativeScope_nativeAddAttachment( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { sentry_clear_attachments(); } -static void -send_envelope(sentry_envelope_t *envelope, void *data) -{ - const char *outbox_path = (const char *)data; +static void send_envelope(sentry_envelope_t *envelope, void *data) { + const char *outbox_path = (const char *) data; char envelope_id_str[40]; sentry_uuid_t envelope_id = sentry_uuid_new_v4(); @@ -269,8 +264,7 @@ send_envelope(sentry_envelope_t *envelope, void *data) size_t final_len = outbox_len + 42; // "/" + envelope_id_str + "\0" = 42 char *envelope_path = sentry_malloc(final_len); ENSURE(envelope_path); - int written = snprintf( - envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); + int written = snprintf(envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); if (written > outbox_len && written < final_len) { sentry_envelope_write_to_file(envelope, envelope_path); } @@ -281,31 +275,26 @@ send_envelope(sentry_envelope_t *envelope, void *data) JNIEXPORT jint JNICALL Java_io_sentry_ndk_SentryNdk_initSentryNative( - JNIEnv *env, jclass cls, jobject sentry_ndk_options) -{ + JNIEnv *env, + jclass cls, + jobject sentry_ndk_options) { jclass options_cls = (*env)->GetObjectClass(env, sentry_ndk_options); - jmethodID outbox_path_mid = (*env)->GetMethodID( - env, options_cls, "getOutboxPath", "()Ljava/lang/String;"); - jmethodID dsn_mid = (*env)->GetMethodID( - env, options_cls, "getDsn", "()Ljava/lang/String;"); - jmethodID is_debug_mid - = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); - jmethodID release_mid = (*env)->GetMethodID( - env, options_cls, "getRelease", "()Ljava/lang/String;"); - jmethodID environment_mid = (*env)->GetMethodID( - env, options_cls, "getEnvironment", "()Ljava/lang/String;"); - jmethodID dist_mid = (*env)->GetMethodID( - env, options_cls, "getDist", "()Ljava/lang/String;"); - jmethodID max_crumbs_mid - = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); - jmethodID native_sdk_name_mid = (*env)->GetMethodID( - env, options_cls, "getSdkName", "()Ljava/lang/String;"); - - jmethodID handler_strategy_mid - = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); - - jmethodID traces_sample_rate_mid - = (*env)->GetMethodID(env, options_cls, "getTracesSampleRate", "()F"); + jmethodID outbox_path_mid = (*env)->GetMethodID(env, options_cls, "getOutboxPath", + "()Ljava/lang/String;"); + jmethodID dsn_mid = (*env)->GetMethodID(env, options_cls, "getDsn", "()Ljava/lang/String;"); + jmethodID is_debug_mid = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); + jmethodID release_mid = (*env)->GetMethodID(env, options_cls, "getRelease", + "()Ljava/lang/String;"); + jmethodID environment_mid = (*env)->GetMethodID(env, options_cls, "getEnvironment", + "()Ljava/lang/String;"); + jmethodID dist_mid = (*env)->GetMethodID(env, options_cls, "getDist", "()Ljava/lang/String;"); + jmethodID max_crumbs_mid = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); + jmethodID native_sdk_name_mid = (*env)->GetMethodID(env, options_cls, "getSdkName", + "()Ljava/lang/String;"); + + jmethodID handler_strategy_mid = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); + + jmethodID traces_sample_rate_mid = (*env)->GetMethodID(env, options_cls, "getTracesSampleRate", "()F"); (*env)->DeleteLocalRef(env, options_cls); @@ -323,16 +312,13 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( options = sentry_options_new(); ENSURE_OR_FAIL(options); - // session tracking is enabled by default, but the Android SDK already - // handles it + // session tracking is enabled by default, but the Android SDK already handles it sentry_options_set_auto_session_tracking(options, 0); - jboolean debug = (jboolean)(*env)->CallBooleanMethod( - env, sentry_ndk_options, is_debug_mid); + jboolean debug = (jboolean) (*env)->CallBooleanMethod(env, sentry_ndk_options, is_debug_mid); sentry_options_set_debug(options, debug); - jint max_crumbs - = (jint)(*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); + jint max_crumbs = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); sentry_options_set_max_breadcrumbs(options, max_crumbs); outbox_path = call_get_string(env, sentry_ndk_options, outbox_path_mid); @@ -347,8 +333,7 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_options_set_transport(options, transport); options_owns_transport = true; - // give sentry-native its own database path it can work with, next to the - // outbox + // give sentry-native its own database path it can work with, next to the outbox size_t outbox_len = strlen(outbox_path); size_t final_len = outbox_len + 15; // len(".sentry-native\0") = 15 char *database_path = sentry_malloc(final_len); @@ -356,8 +341,7 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( strncpy(database_path, outbox_path, final_len); char *dir = strrchr(database_path, '/'); if (dir) { - strncpy( - dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); + strncpy(dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); } sentry_options_set_database_path(options, database_path); sentry_free(database_path); @@ -385,25 +369,22 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_free(dist_str); } - native_sdk_name_str - = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); + native_sdk_name_str = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); if (native_sdk_name_str) { sentry_options_set_sdk_name(options, native_sdk_name_str); sentry_free(native_sdk_name_str); } - jint handler_strategy = (jint)(*env)->CallIntMethod( - env, sentry_ndk_options, handler_strategy_mid); + jint handler_strategy = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, handler_strategy_mid); sentry_options_set_handler_strategy(options, handler_strategy); - jfloat traces_sample_rate = (jfloat)(*env)->CallFloatMethod( - env, sentry_ndk_options, traces_sample_rate_mid); + jfloat traces_sample_rate = (jfloat) (*env)->CallFloatMethod(env, sentry_ndk_options, traces_sample_rate_mid); sentry_options_set_traces_sample_rate(options, traces_sample_rate); int rv = sentry_init(options); - return (jint)rv; + return (jint) rv; -fail: + fail: if (!transport_owns_path) { sentry_free(outbox_path); } @@ -411,20 +392,16 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_transport_free(transport); } sentry_options_free(options); - return (jint)-1; + return (jint) -1; } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList( - JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList(JNIEnv *env, jclass cls) { sentry_clear_modulecache(); } JNIEXPORT jobjectArray JNICALL -Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( - JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jclass cls) { sentry_value_t image_list_t = sentry_get_modules_list(); jobjectArray image_list = NULL; @@ -434,68 +411,61 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( jclass image_class = (*env)->FindClass(env, "io/sentry/ndk/DebugImage"); image_list = (*env)->NewObjectArray(env, len_t, image_class, NULL); - jmethodID image_addr_method = (*env)->GetMethodID( - env, image_class, "setImageAddr", "(Ljava/lang/String;)V"); + jmethodID image_addr_method = (*env)->GetMethodID(env, image_class, "setImageAddr", + "(Ljava/lang/String;)V"); - jmethodID image_size_method - = (*env)->GetMethodID(env, image_class, "setImageSize", "(J)V"); + jmethodID image_size_method = (*env)->GetMethodID(env, image_class, "setImageSize", + "(J)V"); - jmethodID code_file_method = (*env)->GetMethodID( - env, image_class, "setCodeFile", "(Ljava/lang/String;)V"); + jmethodID code_file_method = (*env)->GetMethodID(env, image_class, "setCodeFile", + "(Ljava/lang/String;)V"); - jmethodID image_addr_ctor - = (*env)->GetMethodID(env, image_class, "", "()V"); + jmethodID image_addr_ctor = (*env)->GetMethodID(env, image_class, "", + "()V"); - jmethodID type_method = (*env)->GetMethodID( - env, image_class, "setType", "(Ljava/lang/String;)V"); + jmethodID type_method = (*env)->GetMethodID(env, image_class, "setType", + "(Ljava/lang/String;)V"); - jmethodID debug_id_method = (*env)->GetMethodID( - env, image_class, "setDebugId", "(Ljava/lang/String;)V"); + jmethodID debug_id_method = (*env)->GetMethodID(env, image_class, "setDebugId", + "(Ljava/lang/String;)V"); - jmethodID code_id_method = (*env)->GetMethodID( - env, image_class, "setCodeId", "(Ljava/lang/String;)V"); + jmethodID code_id_method = (*env)->GetMethodID(env, image_class, "setCodeId", + "(Ljava/lang/String;)V"); - jmethodID debug_file_method = (*env)->GetMethodID( - env, image_class, "setDebugFile", "(Ljava/lang/String;)V"); + jmethodID debug_file_method = (*env)->GetMethodID(env, image_class, "setDebugFile", + "(Ljava/lang/String;)V"); for (size_t i = 0; i < len_t; i++) { sentry_value_t image_t = sentry_value_get_by_index(image_list_t, i); if (!sentry_value_is_null(image_t)) { - jobject image - = (*env)->NewObject(env, image_class, image_addr_ctor); + jobject image = (*env)->NewObject(env, image_class, image_addr_ctor); - sentry_value_t image_addr_t - = sentry_value_get_by_key(image_t, "image_addr"); + sentry_value_t image_addr_t = sentry_value_get_by_key(image_t, "image_addr"); if (!sentry_value_is_null(image_addr_t)) { const char *value_v = sentry_value_as_string(image_addr_t); jstring value = (*env)->NewStringUTF(env, value_v); - (*env)->CallVoidMethod( - env, image, image_addr_method, value); + (*env)->CallVoidMethod(env, image, image_addr_method, value); - // Local refs (eg NewStringUTF) are freed automatically when - // the native method returns, but if you're iterating a - // large array, it's recommended to release manually due to - // allocation limits (512) on Android < 8 or OOM. + // Local refs (eg NewStringUTF) are freed automatically when the native method + // returns, but if you're iterating a large array, it's recommended to release + // manually due to allocation limits (512) on Android < 8 or OOM. // https://developer.android.com/training/articles/perf-jni.html#local-and-global-references (*env)->DeleteLocalRef(env, value); } - sentry_value_t image_size_t - = sentry_value_get_by_key(image_t, "image_size"); + sentry_value_t image_size_t = sentry_value_get_by_key(image_t, "image_size"); if (!sentry_value_is_null(image_size_t)) { int32_t value_v = sentry_value_as_int32(image_size_t); - jlong value = (jlong)value_v; + jlong value = (jlong) value_v; - (*env)->CallVoidMethod( - env, image, image_size_method, value); + (*env)->CallVoidMethod(env, image, image_size_method, value); } - sentry_value_t code_file_t - = sentry_value_get_by_key(image_t, "code_file"); + sentry_value_t code_file_t = sentry_value_get_by_key(image_t, "code_file"); if (!sentry_value_is_null(code_file_t)) { const char *value_v = sentry_value_as_string(code_file_t); @@ -506,8 +476,7 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( (*env)->DeleteLocalRef(env, value); } - sentry_value_t code_type_t - = sentry_value_get_by_key(image_t, "type"); + sentry_value_t code_type_t = sentry_value_get_by_key(image_t, "type"); if (!sentry_value_is_null(code_type_t)) { const char *value_v = sentry_value_as_string(code_type_t); @@ -518,8 +487,7 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( (*env)->DeleteLocalRef(env, value); } - sentry_value_t debug_id_t - = sentry_value_get_by_key(image_t, "debug_id"); + sentry_value_t debug_id_t = sentry_value_get_by_key(image_t, "debug_id"); if (!sentry_value_is_null(code_type_t)) { const char *value_v = sentry_value_as_string(debug_id_t); @@ -530,8 +498,7 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( (*env)->DeleteLocalRef(env, value); } - sentry_value_t code_id_t - = sentry_value_get_by_key(image_t, "code_id"); + sentry_value_t code_id_t = sentry_value_get_by_key(image_t, "code_id"); if (!sentry_value_is_null(code_id_t)) { const char *value_v = sentry_value_as_string(code_id_t); @@ -543,15 +510,13 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( } // not needed on Android, but keeping for forward compatibility - sentry_value_t debug_file_t - = sentry_value_get_by_key(image_t, "debug_file"); + sentry_value_t debug_file_t = sentry_value_get_by_key(image_t, "debug_file"); if (!sentry_value_is_null(debug_file_t)) { const char *value_v = sentry_value_as_string(debug_file_t); jstring value = (*env)->NewStringUTF(env, value_v); - (*env)->CallVoidMethod( - env, image, debug_file_method, value); + (*env)->CallVoidMethod(env, image, debug_file_method, value); (*env)->DeleteLocalRef(env, value); } @@ -569,7 +534,6 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) { sentry_close(); } From 7ccd0fbafea867542b9b9c388edcb5949752f5ce Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 18 Mar 2026 13:14:10 +0100 Subject: [PATCH 05/10] Updated CHANGELOG.md --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ad01ff299..5c5eb51f3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased: +**Features**: + +- Add `addAttachment` and `clearAttachments` to the NDK `NativeScope` API for managing file attachments via JNI. ([#1584](https://github.com/getsentry/sentry-native/pull/1584)) + **Fixes**: - inproc: only the handling thread cleans up after the crash. ([#1579](https://github.com/getsentry/sentry-native/pull/1579)) @@ -118,7 +122,6 @@ - Add logs flush on `sentry_flush()`. ([#1434](https://github.com/getsentry/sentry-native/pull/1434)) - Add global attributes API. These are added to all `sentry_log_X` calls. ([#1450](https://github.com/getsentry/sentry-native/pull/1450)) - ## 0.12.1 **Fixes**: From 21377d63b3e497a83cbb6cc19df6178814ab6228 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 18 Mar 2026 14:05:51 +0100 Subject: [PATCH 06/10] updated ndk api --- ndk/lib/api/sentry-native-ndk.api | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ndk/lib/api/sentry-native-ndk.api b/ndk/lib/api/sentry-native-ndk.api index 4ab6d7b1aa..e172390425 100644 --- a/ndk/lib/api/sentry-native-ndk.api +++ b/ndk/lib/api/sentry-native-ndk.api @@ -29,7 +29,9 @@ public final class io/sentry/ndk/DebugImage { } public abstract interface class io/sentry/ndk/INativeScope { + public abstract fun addAttachment (Ljava/lang/String;)V public abstract fun addBreadcrumb (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public abstract fun clearAttachments ()V public abstract fun removeExtra (Ljava/lang/String;)V public abstract fun removeTag (Ljava/lang/String;)V public abstract fun removeUser ()V @@ -49,8 +51,12 @@ public final class io/sentry/ndk/NativeModuleListLoader { public final class io/sentry/ndk/NativeScope : io/sentry/ndk/INativeScope { public fun ()V + public fun addAttachment (Ljava/lang/String;)V public fun addBreadcrumb (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public fun clearAttachments ()V + public static fun nativeAddAttachment (Ljava/lang/String;)V public static fun nativeAddBreadcrumb (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public static fun nativeClearAttachments ()V public static fun nativeRemoveExtra (Ljava/lang/String;)V public static fun nativeRemoveTag (Ljava/lang/String;)V public static fun nativeRemoveUser ()V From 79f6322542d5e82bfe90401a302c49cdccfcb704 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 19 Mar 2026 11:31:59 +0100 Subject: [PATCH 07/10] expose bytes --- .../main/java/io/sentry/ndk/INativeScope.java | 2 ++ .../main/java/io/sentry/ndk/NativeScope.java | 7 +++++ ndk/lib/src/main/jni/sentry.c | 26 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java b/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java index 16570c09ca..9f683d12f1 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/INativeScope.java @@ -20,5 +20,7 @@ void addBreadcrumb( void addAttachment(String path); + void addAttachmentBytes(byte[] data, String filename); + void clearAttachments(); } diff --git a/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java b/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java index d5fa50fbce..96201b0de7 100644 --- a/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java +++ b/ndk/lib/src/main/java/io/sentry/ndk/NativeScope.java @@ -21,6 +21,8 @@ public static native void nativeAddBreadcrumb( public static native void nativeAddAttachment(String path); + public static native void nativeAddAttachmentBytes(byte[] data, String filename); + public static native void nativeClearAttachments(); @Override @@ -73,6 +75,11 @@ public void addAttachment(String path) { nativeAddAttachment(path); } + @Override + public void addAttachmentBytes(byte[] data, String filename) { + nativeAddAttachmentBytes(data, filename); + } + @Override public void clearAttachments() { nativeClearAttachments(); diff --git a/ndk/lib/src/main/jni/sentry.c b/ndk/lib/src/main/jni/sentry.c index 3786a1441a..47ba6299d8 100644 --- a/ndk/lib/src/main/jni/sentry.c +++ b/ndk/lib/src/main/jni/sentry.c @@ -248,6 +248,32 @@ Java_io_sentry_ndk_NativeScope_nativeAddAttachment( (*env)->ReleaseStringUTFChars(env, path, charPath); } +JNIEXPORT void JNICALL +Java_io_sentry_ndk_NativeScope_nativeAddAttachmentBytes( + JNIEnv *env, + jclass cls, + jbyteArray data, + jstring filename) { + if (!data || !filename) { + return; + } + jsize bufLen = (*env)->GetArrayLength(env, data); + jbyte *buf = (*env)->GetByteArrayElements(env, data, 0); + if (!buf) { + return; + } + const char *charFilename = (*env)->GetStringUTFChars(env, filename, 0); + if (!charFilename) { + (*env)->ReleaseByteArrayElements(env, data, buf, JNI_ABORT); + return; + } + + sentry_attach_bytes((const char *)buf, (size_t)bufLen, charFilename); + + (*env)->ReleaseStringUTFChars(env, filename, charFilename); + (*env)->ReleaseByteArrayElements(env, data, buf, JNI_ABORT); +} + JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { sentry_clear_attachments(); From e645369242e6445c2732452677e0388de3692132 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 19 Mar 2026 11:35:04 +0100 Subject: [PATCH 08/10] api --- ndk/lib/api/sentry-native-ndk.api | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ndk/lib/api/sentry-native-ndk.api b/ndk/lib/api/sentry-native-ndk.api index e172390425..4997d04447 100644 --- a/ndk/lib/api/sentry-native-ndk.api +++ b/ndk/lib/api/sentry-native-ndk.api @@ -30,6 +30,7 @@ public final class io/sentry/ndk/DebugImage { public abstract interface class io/sentry/ndk/INativeScope { public abstract fun addAttachment (Ljava/lang/String;)V + public abstract fun addAttachmentBytes ([BLjava/lang/String;)V public abstract fun addBreadcrumb (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public abstract fun clearAttachments ()V public abstract fun removeExtra (Ljava/lang/String;)V @@ -52,9 +53,11 @@ public final class io/sentry/ndk/NativeModuleListLoader { public final class io/sentry/ndk/NativeScope : io/sentry/ndk/INativeScope { public fun ()V public fun addAttachment (Ljava/lang/String;)V + public fun addAttachmentBytes ([BLjava/lang/String;)V public fun addBreadcrumb (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public fun clearAttachments ()V public static fun nativeAddAttachment (Ljava/lang/String;)V + public static fun nativeAddAttachmentBytes ([BLjava/lang/String;)V public static fun nativeAddBreadcrumb (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V public static fun nativeClearAttachments ()V public static fun nativeRemoveExtra (Ljava/lang/String;)V From 30947e06cb3a11370bd5c643fb086f8a4ee53375 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 19 Mar 2026 12:52:09 +0100 Subject: [PATCH 09/10] . --- CHANGELOG.md | 2 +- ndk/lib/src/main/jni/sentry.c | 297 +++++++++++++++++++--------------- 2 files changed, 168 insertions(+), 131 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c5eb51f3d..16760b1989 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ **Features**: -- Add `addAttachment` and `clearAttachments` to the NDK `NativeScope` API for managing file attachments via JNI. ([#1584](https://github.com/getsentry/sentry-native/pull/1584)) +- Add `addAttachment` and `clearAttachments` to the NDK `NativeScope` API for managing file and byte attachments via JNI. ([#1584](https://github.com/getsentry/sentry-native/pull/1584)) **Fixes**: diff --git a/ndk/lib/src/main/jni/sentry.c b/ndk/lib/src/main/jni/sentry.c index 47ba6299d8..511585f362 100644 --- a/ndk/lib/src/main/jni/sentry.c +++ b/ndk/lib/src/main/jni/sentry.c @@ -1,20 +1,22 @@ -#include +#include +#include #include #include -#include -#include +#include -#define ENSURE(Expr) \ - if (!(Expr)) \ - return +#define ENSURE(Expr) \ + if (!(Expr)) \ + return -#define ENSURE_OR_FAIL(Expr) \ - if (!(Expr)) \ - goto fail +#define ENSURE_OR_FAIL(Expr) \ + if (!(Expr)) \ + goto fail -static bool get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) { +static bool +get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) +{ jsize utf_len = (*env)->GetStringUTFLength(env, jstr); - if ((size_t) utf_len >= buf_len) { + if ((size_t)utf_len >= buf_len) { return false; } @@ -29,11 +31,13 @@ static bool get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len return true; } -static char *get_string(JNIEnv *env, jstring jstr) { +static char * +get_string(JNIEnv *env, jstring jstr) +{ char *buf = NULL; jsize utf_len = (*env)->GetStringUTFLength(env, jstr); - size_t buf_len = (size_t) utf_len + 1; + size_t buf_len = (size_t)utf_len + 1; buf = sentry_malloc(buf_len); ENSURE_OR_FAIL(buf); @@ -41,30 +45,30 @@ static char *get_string(JNIEnv *env, jstring jstr) { return buf; - fail: +fail: sentry_free(buf); return NULL; } -static char *call_get_string(JNIEnv *env, jobject obj, jmethodID mid) { - jstring j_str = (jstring) (*env)->CallObjectMethod(env, obj, mid); +static char * +call_get_string(JNIEnv *env, jobject obj, jmethodID mid) +{ + jstring j_str = (jstring)(*env)->CallObjectMethod(env, obj, mid); ENSURE_OR_FAIL(j_str); char *str = get_string(env, j_str); (*env)->DeleteLocalRef(env, j_str); return str; - fail: +fail: return NULL; } JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetTag( - JNIEnv *env, - jclass cls, - jstring key, - jstring value) { + JNIEnv *env, jclass cls, jstring key, jstring value) +{ const char *charKey = (*env)->GetStringUTFChars(env, key, 0); const char *charValue = (*env)->GetStringUTFChars(env, value, 0); @@ -75,7 +79,9 @@ Java_io_sentry_ndk_NativeScope_nativeSetTag( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveTag(JNIEnv *env, jclass cls, jstring key) { +Java_io_sentry_ndk_NativeScope_nativeRemoveTag( + JNIEnv *env, jclass cls, jstring key) +{ const char *charKey = (*env)->GetStringUTFChars(env, key, 0); sentry_remove_tag(charKey); @@ -85,10 +91,8 @@ Java_io_sentry_ndk_NativeScope_nativeRemoveTag(JNIEnv *env, jclass cls, jstring JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetExtra( - JNIEnv *env, - jclass cls, - jstring key, - jstring value) { + JNIEnv *env, jclass cls, jstring key, jstring value) +{ const char *charKey = (*env)->GetStringUTFChars(env, key, 0); const char *charValue = (*env)->GetStringUTFChars(env, value, 0); @@ -100,7 +104,9 @@ Java_io_sentry_ndk_NativeScope_nativeSetExtra( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveExtra(JNIEnv *env, jclass cls, jstring key) { +Java_io_sentry_ndk_NativeScope_nativeRemoveExtra( + JNIEnv *env, jclass cls, jstring key) +{ const char *charKey = (*env)->GetStringUTFChars(env, key, 0); sentry_remove_extra(charKey); @@ -109,13 +115,9 @@ Java_io_sentry_ndk_NativeScope_nativeRemoveExtra(JNIEnv *env, jclass cls, jstrin } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeSetUser( - JNIEnv *env, - jclass cls, - jstring id, - jstring email, - jstring ipAddress, - jstring username) { +Java_io_sentry_ndk_NativeScope_nativeSetUser(JNIEnv *env, jclass cls, + jstring id, jstring email, jstring ipAddress, jstring username) +{ sentry_value_t user = sentry_value_new_object(); if (id) { const char *charId = (*env)->GetStringUTFChars(env, id, 0); @@ -125,32 +127,35 @@ Java_io_sentry_ndk_NativeScope_nativeSetUser( if (email) { const char *charEmail = (*env)->GetStringUTFChars(env, email, 0); sentry_value_set_by_key( - user, "email", sentry_value_new_string(charEmail)); + user, "email", sentry_value_new_string(charEmail)); (*env)->ReleaseStringUTFChars(env, email, charEmail); } if (ipAddress) { - const char *charIpAddress = (*env)->GetStringUTFChars(env, ipAddress, 0); + const char *charIpAddress + = (*env)->GetStringUTFChars(env, ipAddress, 0); sentry_value_set_by_key( - user, "ip_address", sentry_value_new_string(charIpAddress)); + user, "ip_address", sentry_value_new_string(charIpAddress)); (*env)->ReleaseStringUTFChars(env, ipAddress, charIpAddress); } if (username) { const char *charUsername = (*env)->GetStringUTFChars(env, username, 0); sentry_value_set_by_key( - user, "username", sentry_value_new_string(charUsername)); + user, "username", sentry_value_new_string(charUsername)); (*env)->ReleaseStringUTFChars(env, username, charUsername); } sentry_set_user(user); } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) +{ sentry_remove_user(); } JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetTrace( - JNIEnv *env, jclass cls, jstring trace_id, jstring parent_span_id) { + JNIEnv *env, jclass cls, jstring trace_id, jstring parent_span_id) +{ const char *charTraceId = (*env)->GetStringUTFChars(env, trace_id, 0); const char *charParentSpanId = (*env)->GetStringUTFChars(env, parent_span_id, 0); @@ -162,15 +167,10 @@ Java_io_sentry_ndk_NativeScope_nativeSetTrace( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( - JNIEnv *env, - jclass cls, - jstring level, - jstring message, - jstring category, - jstring type, - jstring timestamp, - jstring data) { +Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, + jstring level, jstring message, jstring category, jstring type, + jstring timestamp, jstring data) +{ if (!level && !message && !category && !type) { return; } @@ -194,21 +194,23 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( if (category) { const char *charCategory = (*env)->GetStringUTFChars(env, category, 0); sentry_value_set_by_key( - crumb, "category", sentry_value_new_string(charCategory)); + crumb, "category", sentry_value_new_string(charCategory)); (*env)->ReleaseStringUTFChars(env, category, charCategory); } if (level) { const char *charLevel = (*env)->GetStringUTFChars(env, level, 0); sentry_value_set_by_key( - crumb, "level", sentry_value_new_string(charLevel)); + crumb, "level", sentry_value_new_string(charLevel)); (*env)->ReleaseStringUTFChars(env, level, charLevel); } if (timestamp) { - // overwrite timestamp that is already created on sentry_value_new_breadcrumb - const char *charTimestamp = (*env)->GetStringUTFChars(env, timestamp, 0); + // overwrite timestamp that is already created on + // sentry_value_new_breadcrumb + const char *charTimestamp + = (*env)->GetStringUTFChars(env, timestamp, 0); sentry_value_set_by_key( - crumb, "timestamp", sentry_value_new_string(charTimestamp)); + crumb, "timestamp", sentry_value_new_string(charTimestamp)); (*env)->ReleaseStringUTFChars(env, timestamp, charTimestamp); } @@ -217,7 +219,8 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( // we create an object because the Java layer parses it as a Map sentry_value_t dataObject = sentry_value_new_object(); - sentry_value_set_by_key(dataObject, "data", sentry_value_new_string(charData)); + sentry_value_set_by_key( + dataObject, "data", sentry_value_new_string(charData)); sentry_value_set_by_key(crumb, "data", dataObject); @@ -229,9 +232,8 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeAddAttachment( - JNIEnv *env, - jclass cls, - jstring path) { + JNIEnv *env, jclass cls, jstring path) +{ if (!path) { return; } @@ -250,10 +252,8 @@ Java_io_sentry_ndk_NativeScope_nativeAddAttachment( JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeAddAttachmentBytes( - JNIEnv *env, - jclass cls, - jbyteArray data, - jstring filename) { + JNIEnv *env, jclass cls, jbyteArray data, jstring filename) +{ if (!data || !filename) { return; } @@ -268,6 +268,9 @@ Java_io_sentry_ndk_NativeScope_nativeAddAttachmentBytes( return; } + // The returned sentry_attachment_t* is intentionally discarded. + // We are not tracking it across the JNI boundary for individual removals. + // Use sentry_clear_attachments() for bulk removal. sentry_attach_bytes((const char *)buf, (size_t)bufLen, charFilename); (*env)->ReleaseStringUTFChars(env, filename, charFilename); @@ -275,12 +278,15 @@ Java_io_sentry_ndk_NativeScope_nativeAddAttachmentBytes( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) +{ sentry_clear_attachments(); } -static void send_envelope(sentry_envelope_t *envelope, void *data) { - const char *outbox_path = (const char *) data; +static void +send_envelope(sentry_envelope_t *envelope, void *data) +{ + const char *outbox_path = (const char *)data; char envelope_id_str[40]; sentry_uuid_t envelope_id = sentry_uuid_new_v4(); @@ -290,7 +296,8 @@ static void send_envelope(sentry_envelope_t *envelope, void *data) { size_t final_len = outbox_len + 42; // "/" + envelope_id_str + "\0" = 42 char *envelope_path = sentry_malloc(final_len); ENSURE(envelope_path); - int written = snprintf(envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); + int written = snprintf( + envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); if (written > outbox_len && written < final_len) { sentry_envelope_write_to_file(envelope, envelope_path); } @@ -301,26 +308,31 @@ static void send_envelope(sentry_envelope_t *envelope, void *data) { JNIEXPORT jint JNICALL Java_io_sentry_ndk_SentryNdk_initSentryNative( - JNIEnv *env, - jclass cls, - jobject sentry_ndk_options) { + JNIEnv *env, jclass cls, jobject sentry_ndk_options) +{ jclass options_cls = (*env)->GetObjectClass(env, sentry_ndk_options); - jmethodID outbox_path_mid = (*env)->GetMethodID(env, options_cls, "getOutboxPath", - "()Ljava/lang/String;"); - jmethodID dsn_mid = (*env)->GetMethodID(env, options_cls, "getDsn", "()Ljava/lang/String;"); - jmethodID is_debug_mid = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); - jmethodID release_mid = (*env)->GetMethodID(env, options_cls, "getRelease", - "()Ljava/lang/String;"); - jmethodID environment_mid = (*env)->GetMethodID(env, options_cls, "getEnvironment", - "()Ljava/lang/String;"); - jmethodID dist_mid = (*env)->GetMethodID(env, options_cls, "getDist", "()Ljava/lang/String;"); - jmethodID max_crumbs_mid = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); - jmethodID native_sdk_name_mid = (*env)->GetMethodID(env, options_cls, "getSdkName", - "()Ljava/lang/String;"); - - jmethodID handler_strategy_mid = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); - - jmethodID traces_sample_rate_mid = (*env)->GetMethodID(env, options_cls, "getTracesSampleRate", "()F"); + jmethodID outbox_path_mid = (*env)->GetMethodID( + env, options_cls, "getOutboxPath", "()Ljava/lang/String;"); + jmethodID dsn_mid = (*env)->GetMethodID( + env, options_cls, "getDsn", "()Ljava/lang/String;"); + jmethodID is_debug_mid + = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); + jmethodID release_mid = (*env)->GetMethodID( + env, options_cls, "getRelease", "()Ljava/lang/String;"); + jmethodID environment_mid = (*env)->GetMethodID( + env, options_cls, "getEnvironment", "()Ljava/lang/String;"); + jmethodID dist_mid = (*env)->GetMethodID( + env, options_cls, "getDist", "()Ljava/lang/String;"); + jmethodID max_crumbs_mid + = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); + jmethodID native_sdk_name_mid = (*env)->GetMethodID( + env, options_cls, "getSdkName", "()Ljava/lang/String;"); + + jmethodID handler_strategy_mid + = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); + + jmethodID traces_sample_rate_mid + = (*env)->GetMethodID(env, options_cls, "getTracesSampleRate", "()F"); (*env)->DeleteLocalRef(env, options_cls); @@ -338,13 +350,16 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( options = sentry_options_new(); ENSURE_OR_FAIL(options); - // session tracking is enabled by default, but the Android SDK already handles it + // session tracking is enabled by default, but the Android SDK already + // handles it sentry_options_set_auto_session_tracking(options, 0); - jboolean debug = (jboolean) (*env)->CallBooleanMethod(env, sentry_ndk_options, is_debug_mid); + jboolean debug = (jboolean)(*env)->CallBooleanMethod( + env, sentry_ndk_options, is_debug_mid); sentry_options_set_debug(options, debug); - jint max_crumbs = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); + jint max_crumbs + = (jint)(*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); sentry_options_set_max_breadcrumbs(options, max_crumbs); outbox_path = call_get_string(env, sentry_ndk_options, outbox_path_mid); @@ -359,7 +374,8 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_options_set_transport(options, transport); options_owns_transport = true; - // give sentry-native its own database path it can work with, next to the outbox + // give sentry-native its own database path it can work with, next to the + // outbox size_t outbox_len = strlen(outbox_path); size_t final_len = outbox_len + 15; // len(".sentry-native\0") = 15 char *database_path = sentry_malloc(final_len); @@ -367,7 +383,8 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( strncpy(database_path, outbox_path, final_len); char *dir = strrchr(database_path, '/'); if (dir) { - strncpy(dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); + strncpy( + dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); } sentry_options_set_database_path(options, database_path); sentry_free(database_path); @@ -395,22 +412,25 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_free(dist_str); } - native_sdk_name_str = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); + native_sdk_name_str + = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); if (native_sdk_name_str) { sentry_options_set_sdk_name(options, native_sdk_name_str); sentry_free(native_sdk_name_str); } - jint handler_strategy = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, handler_strategy_mid); + jint handler_strategy = (jint)(*env)->CallIntMethod( + env, sentry_ndk_options, handler_strategy_mid); sentry_options_set_handler_strategy(options, handler_strategy); - jfloat traces_sample_rate = (jfloat) (*env)->CallFloatMethod(env, sentry_ndk_options, traces_sample_rate_mid); + jfloat traces_sample_rate = (jfloat)(*env)->CallFloatMethod( + env, sentry_ndk_options, traces_sample_rate_mid); sentry_options_set_traces_sample_rate(options, traces_sample_rate); int rv = sentry_init(options); - return (jint) rv; + return (jint)rv; - fail: +fail: if (!transport_owns_path) { sentry_free(outbox_path); } @@ -418,16 +438,20 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_transport_free(transport); } sentry_options_free(options); - return (jint) -1; + return (jint)-1; } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList( + JNIEnv *env, jclass cls) +{ sentry_clear_modulecache(); } JNIEXPORT jobjectArray JNICALL -Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( + JNIEnv *env, jclass cls) +{ sentry_value_t image_list_t = sentry_get_modules_list(); jobjectArray image_list = NULL; @@ -437,61 +461,68 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla jclass image_class = (*env)->FindClass(env, "io/sentry/ndk/DebugImage"); image_list = (*env)->NewObjectArray(env, len_t, image_class, NULL); - jmethodID image_addr_method = (*env)->GetMethodID(env, image_class, "setImageAddr", - "(Ljava/lang/String;)V"); + jmethodID image_addr_method = (*env)->GetMethodID( + env, image_class, "setImageAddr", "(Ljava/lang/String;)V"); - jmethodID image_size_method = (*env)->GetMethodID(env, image_class, "setImageSize", - "(J)V"); + jmethodID image_size_method + = (*env)->GetMethodID(env, image_class, "setImageSize", "(J)V"); - jmethodID code_file_method = (*env)->GetMethodID(env, image_class, "setCodeFile", - "(Ljava/lang/String;)V"); + jmethodID code_file_method = (*env)->GetMethodID( + env, image_class, "setCodeFile", "(Ljava/lang/String;)V"); - jmethodID image_addr_ctor = (*env)->GetMethodID(env, image_class, "", - "()V"); + jmethodID image_addr_ctor + = (*env)->GetMethodID(env, image_class, "", "()V"); - jmethodID type_method = (*env)->GetMethodID(env, image_class, "setType", - "(Ljava/lang/String;)V"); + jmethodID type_method = (*env)->GetMethodID( + env, image_class, "setType", "(Ljava/lang/String;)V"); - jmethodID debug_id_method = (*env)->GetMethodID(env, image_class, "setDebugId", - "(Ljava/lang/String;)V"); + jmethodID debug_id_method = (*env)->GetMethodID( + env, image_class, "setDebugId", "(Ljava/lang/String;)V"); - jmethodID code_id_method = (*env)->GetMethodID(env, image_class, "setCodeId", - "(Ljava/lang/String;)V"); + jmethodID code_id_method = (*env)->GetMethodID( + env, image_class, "setCodeId", "(Ljava/lang/String;)V"); - jmethodID debug_file_method = (*env)->GetMethodID(env, image_class, "setDebugFile", - "(Ljava/lang/String;)V"); + jmethodID debug_file_method = (*env)->GetMethodID( + env, image_class, "setDebugFile", "(Ljava/lang/String;)V"); for (size_t i = 0; i < len_t; i++) { sentry_value_t image_t = sentry_value_get_by_index(image_list_t, i); if (!sentry_value_is_null(image_t)) { - jobject image = (*env)->NewObject(env, image_class, image_addr_ctor); + jobject image + = (*env)->NewObject(env, image_class, image_addr_ctor); - sentry_value_t image_addr_t = sentry_value_get_by_key(image_t, "image_addr"); + sentry_value_t image_addr_t + = sentry_value_get_by_key(image_t, "image_addr"); if (!sentry_value_is_null(image_addr_t)) { const char *value_v = sentry_value_as_string(image_addr_t); jstring value = (*env)->NewStringUTF(env, value_v); - (*env)->CallVoidMethod(env, image, image_addr_method, value); + (*env)->CallVoidMethod( + env, image, image_addr_method, value); - // Local refs (eg NewStringUTF) are freed automatically when the native method - // returns, but if you're iterating a large array, it's recommended to release - // manually due to allocation limits (512) on Android < 8 or OOM. + // Local refs (eg NewStringUTF) are freed automatically when + // the native method returns, but if you're iterating a + // large array, it's recommended to release manually due to + // allocation limits (512) on Android < 8 or OOM. // https://developer.android.com/training/articles/perf-jni.html#local-and-global-references (*env)->DeleteLocalRef(env, value); } - sentry_value_t image_size_t = sentry_value_get_by_key(image_t, "image_size"); + sentry_value_t image_size_t + = sentry_value_get_by_key(image_t, "image_size"); if (!sentry_value_is_null(image_size_t)) { int32_t value_v = sentry_value_as_int32(image_size_t); - jlong value = (jlong) value_v; + jlong value = (jlong)value_v; - (*env)->CallVoidMethod(env, image, image_size_method, value); + (*env)->CallVoidMethod( + env, image, image_size_method, value); } - sentry_value_t code_file_t = sentry_value_get_by_key(image_t, "code_file"); + sentry_value_t code_file_t + = sentry_value_get_by_key(image_t, "code_file"); if (!sentry_value_is_null(code_file_t)) { const char *value_v = sentry_value_as_string(code_file_t); @@ -502,7 +533,8 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla (*env)->DeleteLocalRef(env, value); } - sentry_value_t code_type_t = sentry_value_get_by_key(image_t, "type"); + sentry_value_t code_type_t + = sentry_value_get_by_key(image_t, "type"); if (!sentry_value_is_null(code_type_t)) { const char *value_v = sentry_value_as_string(code_type_t); @@ -513,7 +545,8 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla (*env)->DeleteLocalRef(env, value); } - sentry_value_t debug_id_t = sentry_value_get_by_key(image_t, "debug_id"); + sentry_value_t debug_id_t + = sentry_value_get_by_key(image_t, "debug_id"); if (!sentry_value_is_null(code_type_t)) { const char *value_v = sentry_value_as_string(debug_id_t); @@ -524,7 +557,8 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla (*env)->DeleteLocalRef(env, value); } - sentry_value_t code_id_t = sentry_value_get_by_key(image_t, "code_id"); + sentry_value_t code_id_t + = sentry_value_get_by_key(image_t, "code_id"); if (!sentry_value_is_null(code_id_t)) { const char *value_v = sentry_value_as_string(code_id_t); @@ -536,13 +570,15 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla } // not needed on Android, but keeping for forward compatibility - sentry_value_t debug_file_t = sentry_value_get_by_key(image_t, "debug_file"); + sentry_value_t debug_file_t + = sentry_value_get_by_key(image_t, "debug_file"); if (!sentry_value_is_null(debug_file_t)) { const char *value_v = sentry_value_as_string(debug_file_t); jstring value = (*env)->NewStringUTF(env, value_v); - (*env)->CallVoidMethod(env, image, debug_file_method, value); + (*env)->CallVoidMethod( + env, image, debug_file_method, value); (*env)->DeleteLocalRef(env, value); } @@ -560,6 +596,7 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jcla } JNIEXPORT void JNICALL -Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) { +Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) +{ sentry_close(); } From 3550b74ef54573f99be1fa312cb00e51fbfcf5f9 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 19 Mar 2026 12:59:34 +0100 Subject: [PATCH 10/10] don't mess with the formatting --- ndk/lib/src/main/jni/sentry.c | 294 +++++++++++++++------------------- 1 file changed, 130 insertions(+), 164 deletions(-) diff --git a/ndk/lib/src/main/jni/sentry.c b/ndk/lib/src/main/jni/sentry.c index 511585f362..eac279959b 100644 --- a/ndk/lib/src/main/jni/sentry.c +++ b/ndk/lib/src/main/jni/sentry.c @@ -1,22 +1,20 @@ -#include -#include +#include #include #include -#include +#include +#include -#define ENSURE(Expr) \ - if (!(Expr)) \ - return +#define ENSURE(Expr) \ + if (!(Expr)) \ + return -#define ENSURE_OR_FAIL(Expr) \ - if (!(Expr)) \ - goto fail +#define ENSURE_OR_FAIL(Expr) \ + if (!(Expr)) \ + goto fail -static bool -get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) -{ +static bool get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) { jsize utf_len = (*env)->GetStringUTFLength(env, jstr); - if ((size_t)utf_len >= buf_len) { + if ((size_t) utf_len >= buf_len) { return false; } @@ -31,13 +29,11 @@ get_string_into(JNIEnv *env, jstring jstr, char *buf, size_t buf_len) return true; } -static char * -get_string(JNIEnv *env, jstring jstr) -{ +static char *get_string(JNIEnv *env, jstring jstr) { char *buf = NULL; jsize utf_len = (*env)->GetStringUTFLength(env, jstr); - size_t buf_len = (size_t)utf_len + 1; + size_t buf_len = (size_t) utf_len + 1; buf = sentry_malloc(buf_len); ENSURE_OR_FAIL(buf); @@ -45,30 +41,30 @@ get_string(JNIEnv *env, jstring jstr) return buf; -fail: + fail: sentry_free(buf); return NULL; } -static char * -call_get_string(JNIEnv *env, jobject obj, jmethodID mid) -{ - jstring j_str = (jstring)(*env)->CallObjectMethod(env, obj, mid); +static char *call_get_string(JNIEnv *env, jobject obj, jmethodID mid) { + jstring j_str = (jstring) (*env)->CallObjectMethod(env, obj, mid); ENSURE_OR_FAIL(j_str); char *str = get_string(env, j_str); (*env)->DeleteLocalRef(env, j_str); return str; -fail: + fail: return NULL; } JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetTag( - JNIEnv *env, jclass cls, jstring key, jstring value) -{ + JNIEnv *env, + jclass cls, + jstring key, + jstring value) { const char *charKey = (*env)->GetStringUTFChars(env, key, 0); const char *charValue = (*env)->GetStringUTFChars(env, value, 0); @@ -79,9 +75,7 @@ Java_io_sentry_ndk_NativeScope_nativeSetTag( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveTag( - JNIEnv *env, jclass cls, jstring key) -{ +Java_io_sentry_ndk_NativeScope_nativeRemoveTag(JNIEnv *env, jclass cls, jstring key) { const char *charKey = (*env)->GetStringUTFChars(env, key, 0); sentry_remove_tag(charKey); @@ -91,8 +85,10 @@ Java_io_sentry_ndk_NativeScope_nativeRemoveTag( JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetExtra( - JNIEnv *env, jclass cls, jstring key, jstring value) -{ + JNIEnv *env, + jclass cls, + jstring key, + jstring value) { const char *charKey = (*env)->GetStringUTFChars(env, key, 0); const char *charValue = (*env)->GetStringUTFChars(env, value, 0); @@ -104,9 +100,7 @@ Java_io_sentry_ndk_NativeScope_nativeSetExtra( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveExtra( - JNIEnv *env, jclass cls, jstring key) -{ +Java_io_sentry_ndk_NativeScope_nativeRemoveExtra(JNIEnv *env, jclass cls, jstring key) { const char *charKey = (*env)->GetStringUTFChars(env, key, 0); sentry_remove_extra(charKey); @@ -115,9 +109,13 @@ Java_io_sentry_ndk_NativeScope_nativeRemoveExtra( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeSetUser(JNIEnv *env, jclass cls, - jstring id, jstring email, jstring ipAddress, jstring username) -{ +Java_io_sentry_ndk_NativeScope_nativeSetUser( + JNIEnv *env, + jclass cls, + jstring id, + jstring email, + jstring ipAddress, + jstring username) { sentry_value_t user = sentry_value_new_object(); if (id) { const char *charId = (*env)->GetStringUTFChars(env, id, 0); @@ -127,35 +125,32 @@ Java_io_sentry_ndk_NativeScope_nativeSetUser(JNIEnv *env, jclass cls, if (email) { const char *charEmail = (*env)->GetStringUTFChars(env, email, 0); sentry_value_set_by_key( - user, "email", sentry_value_new_string(charEmail)); + user, "email", sentry_value_new_string(charEmail)); (*env)->ReleaseStringUTFChars(env, email, charEmail); } if (ipAddress) { - const char *charIpAddress - = (*env)->GetStringUTFChars(env, ipAddress, 0); + const char *charIpAddress = (*env)->GetStringUTFChars(env, ipAddress, 0); sentry_value_set_by_key( - user, "ip_address", sentry_value_new_string(charIpAddress)); + user, "ip_address", sentry_value_new_string(charIpAddress)); (*env)->ReleaseStringUTFChars(env, ipAddress, charIpAddress); } if (username) { const char *charUsername = (*env)->GetStringUTFChars(env, username, 0); sentry_value_set_by_key( - user, "username", sentry_value_new_string(charUsername)); + user, "username", sentry_value_new_string(charUsername)); (*env)->ReleaseStringUTFChars(env, username, charUsername); } sentry_set_user(user); } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_NativeScope_nativeRemoveUser(JNIEnv *env, jclass cls) { sentry_remove_user(); } JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeSetTrace( - JNIEnv *env, jclass cls, jstring trace_id, jstring parent_span_id) -{ + JNIEnv *env, jclass cls, jstring trace_id, jstring parent_span_id) { const char *charTraceId = (*env)->GetStringUTFChars(env, trace_id, 0); const char *charParentSpanId = (*env)->GetStringUTFChars(env, parent_span_id, 0); @@ -167,10 +162,15 @@ Java_io_sentry_ndk_NativeScope_nativeSetTrace( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, - jstring level, jstring message, jstring category, jstring type, - jstring timestamp, jstring data) -{ +Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb( + JNIEnv *env, + jclass cls, + jstring level, + jstring message, + jstring category, + jstring type, + jstring timestamp, + jstring data) { if (!level && !message && !category && !type) { return; } @@ -194,23 +194,21 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, if (category) { const char *charCategory = (*env)->GetStringUTFChars(env, category, 0); sentry_value_set_by_key( - crumb, "category", sentry_value_new_string(charCategory)); + crumb, "category", sentry_value_new_string(charCategory)); (*env)->ReleaseStringUTFChars(env, category, charCategory); } if (level) { const char *charLevel = (*env)->GetStringUTFChars(env, level, 0); sentry_value_set_by_key( - crumb, "level", sentry_value_new_string(charLevel)); + crumb, "level", sentry_value_new_string(charLevel)); (*env)->ReleaseStringUTFChars(env, level, charLevel); } if (timestamp) { - // overwrite timestamp that is already created on - // sentry_value_new_breadcrumb - const char *charTimestamp - = (*env)->GetStringUTFChars(env, timestamp, 0); + // overwrite timestamp that is already created on sentry_value_new_breadcrumb + const char *charTimestamp = (*env)->GetStringUTFChars(env, timestamp, 0); sentry_value_set_by_key( - crumb, "timestamp", sentry_value_new_string(charTimestamp)); + crumb, "timestamp", sentry_value_new_string(charTimestamp)); (*env)->ReleaseStringUTFChars(env, timestamp, charTimestamp); } @@ -219,8 +217,7 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, // we create an object because the Java layer parses it as a Map sentry_value_t dataObject = sentry_value_new_object(); - sentry_value_set_by_key( - dataObject, "data", sentry_value_new_string(charData)); + sentry_value_set_by_key(dataObject, "data", sentry_value_new_string(charData)); sentry_value_set_by_key(crumb, "data", dataObject); @@ -232,8 +229,9 @@ Java_io_sentry_ndk_NativeScope_nativeAddBreadcrumb(JNIEnv *env, jclass cls, JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeAddAttachment( - JNIEnv *env, jclass cls, jstring path) -{ + JNIEnv *env, + jclass cls, + jstring path) { if (!path) { return; } @@ -252,8 +250,10 @@ Java_io_sentry_ndk_NativeScope_nativeAddAttachment( JNIEXPORT void JNICALL Java_io_sentry_ndk_NativeScope_nativeAddAttachmentBytes( - JNIEnv *env, jclass cls, jbyteArray data, jstring filename) -{ + JNIEnv *env, + jclass cls, + jbyteArray data, + jstring filename) { if (!data || !filename) { return; } @@ -278,15 +278,12 @@ Java_io_sentry_ndk_NativeScope_nativeAddAttachmentBytes( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_NativeScope_nativeClearAttachments(JNIEnv *env, jclass cls) { sentry_clear_attachments(); } -static void -send_envelope(sentry_envelope_t *envelope, void *data) -{ - const char *outbox_path = (const char *)data; +static void send_envelope(sentry_envelope_t *envelope, void *data) { + const char *outbox_path = (const char *) data; char envelope_id_str[40]; sentry_uuid_t envelope_id = sentry_uuid_new_v4(); @@ -296,8 +293,7 @@ send_envelope(sentry_envelope_t *envelope, void *data) size_t final_len = outbox_len + 42; // "/" + envelope_id_str + "\0" = 42 char *envelope_path = sentry_malloc(final_len); ENSURE(envelope_path); - int written = snprintf( - envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); + int written = snprintf(envelope_path, final_len, "%s/%s", outbox_path, envelope_id_str); if (written > outbox_len && written < final_len) { sentry_envelope_write_to_file(envelope, envelope_path); } @@ -308,31 +304,26 @@ send_envelope(sentry_envelope_t *envelope, void *data) JNIEXPORT jint JNICALL Java_io_sentry_ndk_SentryNdk_initSentryNative( - JNIEnv *env, jclass cls, jobject sentry_ndk_options) -{ + JNIEnv *env, + jclass cls, + jobject sentry_ndk_options) { jclass options_cls = (*env)->GetObjectClass(env, sentry_ndk_options); - jmethodID outbox_path_mid = (*env)->GetMethodID( - env, options_cls, "getOutboxPath", "()Ljava/lang/String;"); - jmethodID dsn_mid = (*env)->GetMethodID( - env, options_cls, "getDsn", "()Ljava/lang/String;"); - jmethodID is_debug_mid - = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); - jmethodID release_mid = (*env)->GetMethodID( - env, options_cls, "getRelease", "()Ljava/lang/String;"); - jmethodID environment_mid = (*env)->GetMethodID( - env, options_cls, "getEnvironment", "()Ljava/lang/String;"); - jmethodID dist_mid = (*env)->GetMethodID( - env, options_cls, "getDist", "()Ljava/lang/String;"); - jmethodID max_crumbs_mid - = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); - jmethodID native_sdk_name_mid = (*env)->GetMethodID( - env, options_cls, "getSdkName", "()Ljava/lang/String;"); - - jmethodID handler_strategy_mid - = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); - - jmethodID traces_sample_rate_mid - = (*env)->GetMethodID(env, options_cls, "getTracesSampleRate", "()F"); + jmethodID outbox_path_mid = (*env)->GetMethodID(env, options_cls, "getOutboxPath", + "()Ljava/lang/String;"); + jmethodID dsn_mid = (*env)->GetMethodID(env, options_cls, "getDsn", "()Ljava/lang/String;"); + jmethodID is_debug_mid = (*env)->GetMethodID(env, options_cls, "isDebug", "()Z"); + jmethodID release_mid = (*env)->GetMethodID(env, options_cls, "getRelease", + "()Ljava/lang/String;"); + jmethodID environment_mid = (*env)->GetMethodID(env, options_cls, "getEnvironment", + "()Ljava/lang/String;"); + jmethodID dist_mid = (*env)->GetMethodID(env, options_cls, "getDist", "()Ljava/lang/String;"); + jmethodID max_crumbs_mid = (*env)->GetMethodID(env, options_cls, "getMaxBreadcrumbs", "()I"); + jmethodID native_sdk_name_mid = (*env)->GetMethodID(env, options_cls, "getSdkName", + "()Ljava/lang/String;"); + + jmethodID handler_strategy_mid = (*env)->GetMethodID(env, options_cls, "getNdkHandlerStrategy", "()I"); + + jmethodID traces_sample_rate_mid = (*env)->GetMethodID(env, options_cls, "getTracesSampleRate", "()F"); (*env)->DeleteLocalRef(env, options_cls); @@ -350,16 +341,13 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( options = sentry_options_new(); ENSURE_OR_FAIL(options); - // session tracking is enabled by default, but the Android SDK already - // handles it + // session tracking is enabled by default, but the Android SDK already handles it sentry_options_set_auto_session_tracking(options, 0); - jboolean debug = (jboolean)(*env)->CallBooleanMethod( - env, sentry_ndk_options, is_debug_mid); + jboolean debug = (jboolean) (*env)->CallBooleanMethod(env, sentry_ndk_options, is_debug_mid); sentry_options_set_debug(options, debug); - jint max_crumbs - = (jint)(*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); + jint max_crumbs = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, max_crumbs_mid); sentry_options_set_max_breadcrumbs(options, max_crumbs); outbox_path = call_get_string(env, sentry_ndk_options, outbox_path_mid); @@ -374,8 +362,7 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_options_set_transport(options, transport); options_owns_transport = true; - // give sentry-native its own database path it can work with, next to the - // outbox + // give sentry-native its own database path it can work with, next to the outbox size_t outbox_len = strlen(outbox_path); size_t final_len = outbox_len + 15; // len(".sentry-native\0") = 15 char *database_path = sentry_malloc(final_len); @@ -383,8 +370,7 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( strncpy(database_path, outbox_path, final_len); char *dir = strrchr(database_path, '/'); if (dir) { - strncpy( - dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); + strncpy(dir + 1, ".sentry-native", final_len - (dir + 1 - database_path)); } sentry_options_set_database_path(options, database_path); sentry_free(database_path); @@ -412,25 +398,22 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_free(dist_str); } - native_sdk_name_str - = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); + native_sdk_name_str = call_get_string(env, sentry_ndk_options, native_sdk_name_mid); if (native_sdk_name_str) { sentry_options_set_sdk_name(options, native_sdk_name_str); sentry_free(native_sdk_name_str); } - jint handler_strategy = (jint)(*env)->CallIntMethod( - env, sentry_ndk_options, handler_strategy_mid); + jint handler_strategy = (jint) (*env)->CallIntMethod(env, sentry_ndk_options, handler_strategy_mid); sentry_options_set_handler_strategy(options, handler_strategy); - jfloat traces_sample_rate = (jfloat)(*env)->CallFloatMethod( - env, sentry_ndk_options, traces_sample_rate_mid); + jfloat traces_sample_rate = (jfloat) (*env)->CallFloatMethod(env, sentry_ndk_options, traces_sample_rate_mid); sentry_options_set_traces_sample_rate(options, traces_sample_rate); int rv = sentry_init(options); - return (jint)rv; + return (jint) rv; -fail: + fail: if (!transport_owns_path) { sentry_free(outbox_path); } @@ -438,20 +421,16 @@ Java_io_sentry_ndk_SentryNdk_initSentryNative( sentry_transport_free(transport); } sentry_options_free(options); - return (jint)-1; + return (jint) -1; } JNIEXPORT void JNICALL -Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList( - JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_NativeModuleListLoader_nativeClearModuleList(JNIEnv *env, jclass cls) { sentry_clear_modulecache(); } JNIEXPORT jobjectArray JNICALL -Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( - JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList(JNIEnv *env, jclass cls) { sentry_value_t image_list_t = sentry_get_modules_list(); jobjectArray image_list = NULL; @@ -461,68 +440,61 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( jclass image_class = (*env)->FindClass(env, "io/sentry/ndk/DebugImage"); image_list = (*env)->NewObjectArray(env, len_t, image_class, NULL); - jmethodID image_addr_method = (*env)->GetMethodID( - env, image_class, "setImageAddr", "(Ljava/lang/String;)V"); + jmethodID image_addr_method = (*env)->GetMethodID(env, image_class, "setImageAddr", + "(Ljava/lang/String;)V"); - jmethodID image_size_method - = (*env)->GetMethodID(env, image_class, "setImageSize", "(J)V"); + jmethodID image_size_method = (*env)->GetMethodID(env, image_class, "setImageSize", + "(J)V"); - jmethodID code_file_method = (*env)->GetMethodID( - env, image_class, "setCodeFile", "(Ljava/lang/String;)V"); + jmethodID code_file_method = (*env)->GetMethodID(env, image_class, "setCodeFile", + "(Ljava/lang/String;)V"); - jmethodID image_addr_ctor - = (*env)->GetMethodID(env, image_class, "", "()V"); + jmethodID image_addr_ctor = (*env)->GetMethodID(env, image_class, "", + "()V"); - jmethodID type_method = (*env)->GetMethodID( - env, image_class, "setType", "(Ljava/lang/String;)V"); + jmethodID type_method = (*env)->GetMethodID(env, image_class, "setType", + "(Ljava/lang/String;)V"); - jmethodID debug_id_method = (*env)->GetMethodID( - env, image_class, "setDebugId", "(Ljava/lang/String;)V"); + jmethodID debug_id_method = (*env)->GetMethodID(env, image_class, "setDebugId", + "(Ljava/lang/String;)V"); - jmethodID code_id_method = (*env)->GetMethodID( - env, image_class, "setCodeId", "(Ljava/lang/String;)V"); + jmethodID code_id_method = (*env)->GetMethodID(env, image_class, "setCodeId", + "(Ljava/lang/String;)V"); - jmethodID debug_file_method = (*env)->GetMethodID( - env, image_class, "setDebugFile", "(Ljava/lang/String;)V"); + jmethodID debug_file_method = (*env)->GetMethodID(env, image_class, "setDebugFile", + "(Ljava/lang/String;)V"); for (size_t i = 0; i < len_t; i++) { sentry_value_t image_t = sentry_value_get_by_index(image_list_t, i); if (!sentry_value_is_null(image_t)) { - jobject image - = (*env)->NewObject(env, image_class, image_addr_ctor); + jobject image = (*env)->NewObject(env, image_class, image_addr_ctor); - sentry_value_t image_addr_t - = sentry_value_get_by_key(image_t, "image_addr"); + sentry_value_t image_addr_t = sentry_value_get_by_key(image_t, "image_addr"); if (!sentry_value_is_null(image_addr_t)) { const char *value_v = sentry_value_as_string(image_addr_t); jstring value = (*env)->NewStringUTF(env, value_v); - (*env)->CallVoidMethod( - env, image, image_addr_method, value); + (*env)->CallVoidMethod(env, image, image_addr_method, value); - // Local refs (eg NewStringUTF) are freed automatically when - // the native method returns, but if you're iterating a - // large array, it's recommended to release manually due to - // allocation limits (512) on Android < 8 or OOM. + // Local refs (eg NewStringUTF) are freed automatically when the native method + // returns, but if you're iterating a large array, it's recommended to release + // manually due to allocation limits (512) on Android < 8 or OOM. // https://developer.android.com/training/articles/perf-jni.html#local-and-global-references (*env)->DeleteLocalRef(env, value); } - sentry_value_t image_size_t - = sentry_value_get_by_key(image_t, "image_size"); + sentry_value_t image_size_t = sentry_value_get_by_key(image_t, "image_size"); if (!sentry_value_is_null(image_size_t)) { int32_t value_v = sentry_value_as_int32(image_size_t); - jlong value = (jlong)value_v; + jlong value = (jlong) value_v; - (*env)->CallVoidMethod( - env, image, image_size_method, value); + (*env)->CallVoidMethod(env, image, image_size_method, value); } - sentry_value_t code_file_t - = sentry_value_get_by_key(image_t, "code_file"); + sentry_value_t code_file_t = sentry_value_get_by_key(image_t, "code_file"); if (!sentry_value_is_null(code_file_t)) { const char *value_v = sentry_value_as_string(code_file_t); @@ -533,8 +505,7 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( (*env)->DeleteLocalRef(env, value); } - sentry_value_t code_type_t - = sentry_value_get_by_key(image_t, "type"); + sentry_value_t code_type_t = sentry_value_get_by_key(image_t, "type"); if (!sentry_value_is_null(code_type_t)) { const char *value_v = sentry_value_as_string(code_type_t); @@ -545,8 +516,7 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( (*env)->DeleteLocalRef(env, value); } - sentry_value_t debug_id_t - = sentry_value_get_by_key(image_t, "debug_id"); + sentry_value_t debug_id_t = sentry_value_get_by_key(image_t, "debug_id"); if (!sentry_value_is_null(code_type_t)) { const char *value_v = sentry_value_as_string(debug_id_t); @@ -557,8 +527,7 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( (*env)->DeleteLocalRef(env, value); } - sentry_value_t code_id_t - = sentry_value_get_by_key(image_t, "code_id"); + sentry_value_t code_id_t = sentry_value_get_by_key(image_t, "code_id"); if (!sentry_value_is_null(code_id_t)) { const char *value_v = sentry_value_as_string(code_id_t); @@ -570,15 +539,13 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( } // not needed on Android, but keeping for forward compatibility - sentry_value_t debug_file_t - = sentry_value_get_by_key(image_t, "debug_file"); + sentry_value_t debug_file_t = sentry_value_get_by_key(image_t, "debug_file"); if (!sentry_value_is_null(debug_file_t)) { const char *value_v = sentry_value_as_string(debug_file_t); jstring value = (*env)->NewStringUTF(env, value_v); - (*env)->CallVoidMethod( - env, image, debug_file_method, value); + (*env)->CallVoidMethod(env, image, debug_file_method, value); (*env)->DeleteLocalRef(env, value); } @@ -596,7 +563,6 @@ Java_io_sentry_ndk_NativeModuleListLoader_nativeLoadModuleList( } JNIEXPORT void JNICALL -Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) -{ +Java_io_sentry_ndk_SentryNdk_shutdown(JNIEnv *env, jclass cls) { sentry_close(); }