62 votes

Quelle est l'API Log à appeler depuis un programme Android JNI ?

J'aimerais déboguer une application C JNI en insérant des messages de journal dans logcat. Quelle est l'API C qui permet de faire cela ?

107voto

Ryan Reeves Points 6265

Comme ça :

#include <android/log.h>

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

Ajoutez-le à votre makefile comme ceci :

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

3 votes

La partie "-L$(SYSROOT)/usr/lib" n'est pas nécessaire, juste "LOCAL_LDLIBS := -llog" fonctionnera de la même manière. Pour ceux que cela ne fonctionne pas de toute façon (comme moi)) - J'avais la ligne "include $(CLEAR_VARS)" dans mon Android.mk après "LOCAL_LDLIBS := -llog", l'a déplacé avant et cela fonctionne bien maintenant.

0 votes

Au cas où cela ne fonctionnerait pas, voir la solution ci-dessous.

7 votes

Ou __android_log_print(ANDROID_LOG_INFO, "Tag", "i%c works lik%x print%x", 't', 14, 15) ;

11voto

mk.. Points 2087

Voici l'extrait de code que vous devez inclure dans votre code natif.

#include <android/log.h>

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

Afin d'utiliser l'API ci-dessus, nous devons lier la bibliothèque correspondante.

Nous pouvons lier une bibliothèque partagée dans Android de 3 façons. Dans les 3 cas ci-dessous, les lignes mentionnées doivent être ajoutées dans le fichier Android.mk

Voici donc les trois façons.

#1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Si la première méthode ne fonctionne pas (elle n'a pas fonctionné pour moi), vous pouvez essayer les deux méthodes suivantes.

#2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

#3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

10voto

Ciro Santilli Points 3341

syslog

Cette fonction POSIX produit également des sorties vers logcat.

Il a l'avantage d'être plus portable sur les systèmes autres qu'Android que le système de gestion des données. __android_log_write et il ajoute automatiquement le paquet d'applications au journal.

Testé avec cette application d'exemple : https://github.com/cirosantilli/Android-cheat/tree/a080f5c370c1f06e74a8300fb4a2e93369861047/gradle/NdkSyslog la source du NDK est :

#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");
}

Et logcat contient maintenant :

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

Testé sur Android O, HiKey 960.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X