Я хотел бы отлаживать приложение JNI C, вставляя сообщения журнала в logcat. Что такое C API, который делает это?
Что такое Log API для вызова из программы Android JNI?
Ответы (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
Ниже приведен фрагмент кода, который следует включить в собственный код.
#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
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.