Что такое Log API для вызова из программы Android JNI?

Я хотел бы отлаживать приложение JNI C, вставляя сообщения журнала в logcat. Что такое C API, который делает это?


person hopia    schedule 28.03.2011    source источник


Ответы (3)


Так:

#include <android/log.h>


__android_log_write(ANDROID_LOG_ERROR, "Tag", "Error here");//Or ANDROID_LOG_INFO, ...  

Добавьте его в свой make-файл следующим образом:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
person Ryan Reeves    schedule 28.03.2011
comment
-L$(SYSROOT)/usr/lib часть не нужна, просто LOCAL_LDLIBS := -llog будет работать так же. Для тех, кто все равно не работает (например, я)) - у меня была строка include $(CLEAR_VARS) в моем Android.mk after LOCAL_LDLIBS := -llog, переместил ее before и теперь работает нормально. - person Mixaz; 25.11.2013
comment
На всякий случай, если это не сработает, см. Решение ниже. - person mk..; 31.03.2014
comment
или __android_log_print(ANDROID_LOG_INFO, Tag, i%c работает как lik%x print%x, 't', 14, 15); - person bartolo-otrit; 11.10.2014

Ниже приведен фрагмент кода, который следует включить в собственный код.

#include <android/log.h>


__android_log_write(ANDROID_LOG_ERROR, "Tag", "Error msg");//Or ANDROID_LOG_INFO, ...  

Чтобы использовать вышеуказанный API, нам нужно связать соответствующую библиотеку.

Мы можем связать общую библиотеку в Android тремя способами. В следующих 3 случаях указанные строки должны быть добавлены в Android.mk

Итак, вот три способа.

#1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

По какой-то причине, если 1 не работает (у меня это не сработало), вы можете попробовать следующие 2 способа.

#2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

#3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog
person mk..    schedule 31.03.2014

syslog

Эта функция POSIX также выводит в logcat.

Его преимущество заключается в том, что он более переносим на системы, отличные от Android, чем __android_log_write, и автоматически добавляет пакет приложения в журнал.

Протестировано с этим примером приложения: https://github.com/cirosantilli/android-cheat/tree/a080f5c370c1f06e74a8300fb4a2e93369861047/gradle/NdkSyslog источник NDK:

#include <jni.h>
#include <string>
#include <syslog.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_cirosantilli_android_1cheat_ndksyslog_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    syslog(LOG_CRIT, "hello syslog");
    return env->NewStringUTF("Check adb logcat");
}

И logcat теперь содержит:

01-14 15:39:07.582  3633  3633 E com.cirosantilli.android_cheat.ndksyslog: hello syslog  

Протестировано на Android O, HiKey 960.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 06.11.2017
comment
он поддерживает только литералы - person A.sobhdel; 11.06.2020