Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[versions]
agp = "8.10.0"
agp = "8.10.1"
kotlin = "2.1.10"

[libraries]
Expand Down
69 changes: 31 additions & 38 deletions library/src/main/cpp/logging.cpp
Original file line number Diff line number Diff line change
@@ -1,47 +1,40 @@
#include <jni.h>
#include <android/log.h>
#include <string_view>
#include <functional>

#include "session/logging.hpp"
#include "session/log_level.h"

#define LOG_TAG "LibSession"

extern "C" JNIEXPORT void JNICALL
Java_network_loki_messenger_libsession_1util_util_Logger_initLogger(JNIEnv* env, jclass clazz) {
session::add_logger([](std::string_view msg, std::string_view category, session::LogLevel level) {
android_LogPriority prio = ANDROID_LOG_VERBOSE;

switch (level.level) {
case LOG_LEVEL_TRACE:
prio = ANDROID_LOG_VERBOSE;
break;

case LOG_LEVEL_DEBUG:
prio = ANDROID_LOG_DEBUG;
break;

case LOG_LEVEL_INFO:
prio = ANDROID_LOG_INFO;
break;

case LOG_LEVEL_WARN:
prio = ANDROID_LOG_WARN;
break;

case LOG_LEVEL_ERROR:
case LOG_LEVEL_CRITICAL:
prio = ANDROID_LOG_ERROR;
break;

default:
prio = ANDROID_LOG_INFO;
break;
#include "jni_utils.h"

using namespace jni_utils;

extern "C"
JNIEXPORT void JNICALL
Java_network_loki_messenger_libsession_1util_util_Logger_00024Companion_addLogger(JNIEnv *env, jclass clazz,
jobject logger) {
JavaVM *vm = nullptr;
env->GetJavaVM(&vm);
if (!vm) {
env->ThrowNew(env->FindClass("java/lang/RuntimeException"), "Failed to get JavaVM");
return;
}

jmethodID logMethod = env->GetMethodID(env->GetObjectClass(logger), "log",
"(Ljava/lang/String;Ljava/lang/String;I)V");

auto loggerRef = env->NewGlobalRef(logger);
session::add_logger([vm, logMethod, loggerRef](std::string_view msg, std::string_view category, session::LogLevel level) {
JNIEnv *env = nullptr;
vm->AttachCurrentThread(&env, nullptr);
if (!env) {
return; // Failed to attach thread, cannot log
}

__android_log_print(prio, LOG_TAG, "%.*s [%.*s]",
static_cast<int>(msg.size()), msg.data(),
static_cast<int>(category.size()), category.data());
});
}
env->CallVoidMethod(loggerRef, logMethod,
JavaLocalRef(env, env->NewStringUTF(msg.data())).get(),
JavaLocalRef(env, env->NewStringUTF(category.data())).get(),
static_cast<jint>(level.level)
);
});
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
package network.loki.messenger.libsession_util.util

object Logger {
typealias LogLevel = Int

init {
System.loadLibrary("session_util")
}
interface Logger {
fun log(message: String, category: String, level: LogLevel)

companion object {
const val LOG_LEVEL_TRACE: LogLevel = 0
const val LOG_LEVEL_DEBUG: LogLevel = 1
const val LOG_LEVEL_INFO: LogLevel = 2
const val LOG_LEVEL_WARN: LogLevel = 3
const val LOG_LEVEL_ERROR: LogLevel = 4
const val LOG_LEVEL_CRITICAL: LogLevel = 5
const val LOG_LEVEL_OFF: LogLevel = 6

@JvmStatic
external fun initLogger()
init {
System.loadLibrary("session_util")
}

external fun addLogger(logger: Logger)
}
}