From e7e731e04abb9044afe65b5bd7d9315d1ce7f5d8 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 12 Dec 2023 14:50:42 +0100 Subject: [PATCH] JNI write --- .../main/java/eu/faircode/email/Helper.java | 5 ++--- app/src/main/java/eu/faircode/email/Log.java | 10 ++++++--- app/src/main/jni/fairemail.cc | 21 ++++++++++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index fdf669d21a..9ea4a98f3d 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -2649,7 +2649,7 @@ public class Helper { } // CASA: External storage as well - if (!dir.exists() && !dir.mkdirs()) // TODO CASA + if (!dir.exists() && Log.jni_safe_mkdirs(dir)) throw new IllegalArgumentException("Failed to create directory"); return dir; @@ -2745,8 +2745,7 @@ public class Helper { static void writeText(File file, String content) throws IOException { try (FileOutputStream out = new FileOutputStream(file)) { - if (content != null) - out.write(content.getBytes()); // TODO CASA + Log.write(out, content); } } diff --git a/app/src/main/java/eu/faircode/email/Log.java b/app/src/main/java/eu/faircode/email/Log.java index fa5a76b82d..e5bbeaf250 100644 --- a/app/src/main/java/eu/faircode/email/Log.java +++ b/app/src/main/java/eu/faircode/email/Log.java @@ -243,6 +243,10 @@ public class Log { public static native int jni_safe_log(int prio, String tag, String msg); + public static native boolean jni_safe_mkdirs(File file); + + public static native void jni_safe_write(OutputStream os, byte[] data); + public static native Process jni_safe_runtime_exec(Runtime runtime, String[] cmd); public static native long[] jni_safe_runtime_stats(); @@ -3813,9 +3817,9 @@ public class Log { return ssb; } - private static int write(OutputStream os, String text) throws IOException { - byte[] bytes = text.getBytes(); - os.write(bytes); // TODO CASA + static int write(OutputStream os, String text) throws IOException { + byte[] bytes = (text == null ? new byte[0] : text.getBytes()); + jni_safe_write(os, bytes); return bytes.length; } diff --git a/app/src/main/jni/fairemail.cc b/app/src/main/jni/fairemail.cc index 4f648e5c6a..219f2c3a45 100644 --- a/app/src/main/jni/fairemail.cc +++ b/app/src/main/jni/fairemail.cc @@ -65,6 +65,24 @@ Java_eu_faircode_email_ThrowableWrapper_jni_1get_1safe_1stack_1trace_1string( return (jstring) env->CallStaticObjectMethod(cls, mid, ex); } +extern "C" +JNIEXPORT jboolean JNICALL +Java_eu_faircode_email_Log_jni_1safe_1mkdirs(JNIEnv *env, jclass clazz, + jobject file) { + jclass cls = env->FindClass("java/io/File"); + jmethodID mid = env->GetMethodID(cls, "mkdirs", "()Z"); + return (jboolean) env->CallBooleanMethod(file, mid); +} + +extern "C" +JNIEXPORT void JNICALL +Java_eu_faircode_email_Log_jni_1safe_1write(JNIEnv *env, jclass clazz, + jobject os, jbyteArray data) { + jclass cls = env->FindClass("java/io/OutputStream"); + jmethodID mid = env->GetMethodID(cls, "write", "([B)V"); + env->CallVoidMethod(os, mid, data); +} + extern "C" JNIEXPORT jobject JNICALL Java_eu_faircode_email_Log_jni_1safe_1runtime_1exec(JNIEnv *env, jclass clazz, @@ -122,7 +140,8 @@ Java_eu_faircode_email_DB_jni_1safe_1support_1query(JNIEnv *env, jclass clazz, extern "C" JNIEXPORT jobject JNICALL -Java_eu_faircode_email_DB_jni_1safe_1sqlite_1query(JNIEnv *env, jclass clazz, jobject db, jstring table, jobjectArray columns, +Java_eu_faircode_email_DB_jni_1safe_1sqlite_1query(JNIEnv *env, jclass clazz, jobject db, + jstring table, jobjectArray columns, jstring selection, jobjectArray selection_args, jstring group_by, jstring having, jstring order_by, jstring limit) { jclass cls = env->FindClass("android/database/sqlite/SQLiteDatabase");