si je définis une telle fonction dans le fichier Java
/**
* Adds two integers, returning their sum
*/
public native int add( int v1, int v2 );
donc j'ai besoin de coder dans le fichier c
JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add
(JNIEnv * env, jobject obj, jint value1, jint value2) {
printf("\n this is log messge \n");
return (value1 + value2);
}
alors d'où ce printf imprimera-t-il le message? Dans logcate, je ne comprends pas?
Comment puis-je déboguer une application NDK en mettant des messages de journal?
utilisez plutôt __Android_log_print()
. Vous devez inclure l'en-tête <Android/log.h>
Exemple d'échantillon. __Android_log_print(Android_LOG_DEBUG, "LOG_TAG", "\n this is log messge \n");
Vous pouvez également utiliser un spécificateur de format comme printf -
__Android_log_print(Android_LOG_DEBUG, "LOG_TAG", "Need to print : %d %s",int_var, str_var);
Assurez-vous également de créer un lien avec la bibliothèque de journalisation, dans votre fichier Android.mk:
LOCAL_LDLIBS := -llog
Ohh .. oublié .. La sortie sera affichée dans Logcat
avec la balise LOG_TAG
Approche facile
Ajoutez les lignes suivantes à votre fichier d'en-tête commun.
#include <Android/log.h>
#define LOG_TAG "your-log-tag"
#define LOGD(...) __Android_log_print(Android_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __Android_log_print(Android_LOG_ERROR, LOG_TAG, __VA_ARGS__)
// If you want you can add other log definition for info, warning etc
Maintenant, appelez simplement LOGD("Hello world") or LOGE("Number = %d", any_int)
comme printf in c
.
N'oubliez pas d'inclure le fichier d'en-tête commun.
Supprimer la journalisation
Si vous définissez LOGD(...)
vide, tous les journaux disparaîtront. Il suffit de commenter après LOGD(...)
.
#define LOGD(...) // __Android_log..... rest of the code
Il y a deux options:
1) remplacez printf par __Android_log_print. Vous pouvez le faire facilement avec define au début du code:
#define printf(...) __Android_log_print(Android_LOG_DEBUG, "TAG", __VA_ARGS__);
Bien sûr, cela nécessitera de changer tout le code source qui a printf.
2) rediriger stdout et stderr vers Android logcat (je ne sais pas si cela fonctionnera sur un appareil non rooté): http://developer.Android.com/guide/developing/ debugging/debugging-log.html # ViewingStd
pas besoin de rooter le périphérique, acroding to http://developer.Android.com/guide/developing/debugging/debugging-log.html#viewingStd , ci-dessous peut fonctionner parfaitement.
$ adb Shell
$ su
$ stop
$ setprop log.redirect-stdio true
$ start
terminé!