diff --git a/extension/android/executorch_android/src/main/java/org/pytorch/executorch/ExecutorchRuntimeException.java b/extension/android/executorch_android/src/main/java/org/pytorch/executorch/ExecutorchRuntimeException.java index c036ecefa76..b7cce18f063 100644 --- a/extension/android/executorch_android/src/main/java/org/pytorch/executorch/ExecutorchRuntimeException.java +++ b/extension/android/executorch_android/src/main/java/org/pytorch/executorch/ExecutorchRuntimeException.java @@ -75,7 +75,7 @@ public class ExecutorchRuntimeException extends RuntimeException { } static class ErrorHelper { - private static final boolean ENABLE_READ_LOG_BUFFER = false; + private static final boolean ENABLE_READ_LOG_BUFFER_LOGS = true; // Reusable StringBuilder instance private static final StringBuilder sb = new StringBuilder(); @@ -94,10 +94,12 @@ static String formatMessage(int errorCode, String details) { .append(baseMessage) .append(": ") .append(details); - if (ENABLE_READ_LOG_BUFFER) { + if (ENABLE_READ_LOG_BUFFER_LOGS) { try { - sb.append("\nDetailed Logs:\n"); - String[] logEntries = readLogBuffer(); // JNI call + String[] logEntries = Module.readLogBufferStatic(); // JNI call + if (logEntries != null && logEntries.length > 0) { + sb.append("\n Detailed logs:\n"); + } formatLogEntries(sb, logEntries); } catch (Exception e) { sb.append("Failed to retrieve detailed logs: ").append(e.getMessage()); @@ -108,9 +110,6 @@ static String formatMessage(int errorCode, String details) { } } - // Native JNI method declaration - private static native String[] readLogBuffer(); - // Append log entries to the provided StringBuilder private static void formatLogEntries(StringBuilder sb, String[] logEntries) { if (logEntries == null || logEntries.length == 0) { diff --git a/extension/android/executorch_android/src/main/java/org/pytorch/executorch/Module.java b/extension/android/executorch_android/src/main/java/org/pytorch/executorch/Module.java index 5a546eb18bc..df27e77f4bb 100644 --- a/extension/android/executorch_android/src/main/java/org/pytorch/executorch/Module.java +++ b/extension/android/executorch_android/src/main/java/org/pytorch/executorch/Module.java @@ -206,6 +206,13 @@ public MethodMetadata getMethodMetadata(String name) { return mMethodMetadata.get(name); } + @DoNotStrip + private static native String[] readLogBufferStaticNative(); + + public static String[] readLogBufferStatic() { + return readLogBufferStaticNative(); + } + /** Retrieve the in-memory log buffer, containing the most recent ExecuTorch log entries. */ public String[] readLogBuffer() { return readLogBufferNative(); diff --git a/extension/android/jni/jni_layer.cpp b/extension/android/jni/jni_layer.cpp index e7ef6e62c74..7961ec6c3e2 100644 --- a/extension/android/jni/jni_layer.cpp +++ b/extension/android/jni/jni_layer.cpp @@ -389,6 +389,16 @@ class ExecuTorchJni : public facebook::jni::HybridClass { facebook::jni::local_ref> readLogBuffer() { + return readLogBufferUtil(); + } + + static facebook::jni::local_ref> + readLogBufferStatic(facebook::jni::alias_ref) { + return readLogBufferUtil(); + } + + static facebook::jni::local_ref> + readLogBufferUtil() { #ifdef __ANDROID__ facebook::jni::local_ref> ret; @@ -500,6 +510,8 @@ class ExecuTorchJni : public facebook::jni::HybridClass { makeNativeMethod("executeNative", ExecuTorchJni::execute), makeNativeMethod("loadMethodNative", ExecuTorchJni::load_method), makeNativeMethod("readLogBufferNative", ExecuTorchJni::readLogBuffer), + makeNativeMethod( + "readLogBufferStaticNative", ExecuTorchJni::readLogBufferStatic), makeNativeMethod("etdump", ExecuTorchJni::etdump), makeNativeMethod("getMethods", ExecuTorchJni::getMethods), makeNativeMethod("getUsedBackends", ExecuTorchJni::getUsedBackends),