2010-10-10 11 views
1

Donc, je suis en train d'écrire une application Android qui utilise une grande bibliothèque C++. J'ai tout fonctionné pour que l'application java puisse appeler les méthodes de délégation C++, mais je me trouve en train de souhaiter que je puisse enregistrer des messages de C++ dans le journal Android. C'est facile de java, mais je ne sais pas comment appeler une méthode java à partir de C++. Mes recherches ont trouvé des méthodes pour ouvrir un jvm à partir de C++, ce qui n'est pas du tout ce que je veux faire. Idéalement, je voudrais passer un pointeur de méthode de journal à C++, qui pourrait alors être utilisé quand je le voudrais. Bien sûr, Java ne supporte pas les pointeurs de méthode. Ma méthode java ressemblerait à quelque chose comme:Comment appeler les méthodes Java à partir de C++ dans JNI

private void log(String s){ 
    Log.i(Tag, s);  // Android log 
} 

Je ne sais pas comment autoriser C++ pour accéder à cette méthode.

+0

double possible de [Comment appeler la méthode Java à partir de C++] (http://stackoverflow.com/questions/2617313/how-to-call-java-method-from-c) Voir aussi [ Appels de méthode en C++ avec JNI?] (Http://stackoverflow.com/questions/945087/method-calls-in-c-with-jni) –

+0

C'est tout. Merci! – erock2112

Répondre

6

Les appels C++ vers cout et printfn'apparaîtront pas dans la sortie LogCat. Il y a deux solutions.

  1. Utilisez les macros de journalisation fournies par le NDK pour consigner les messages dans LogCat. C'est bon pour le nouveau code et le code wrapper que vous écrivez, mais pas si bon quand vous avez une bibliothèque pleine d'instructions de débogage existantes. Je définir des macros comme suit:

    #define LOG_INFO(info) __android_log_write(ANDROID_LOG_INFO,"JNI",info) 
    #define LOG_ERROR(error) __android_log_write(ANDROID_LOG_ERROR,"JNI",error) 
    

    puis dans le code source que je peux appeler LOG_INFO("Library is called!");

  2. capture la sortie standard/d'erreur standard du programme et l'entonnoir dans LogCat. A partir de la page Android Debug Bridge:

    Voir stdout et stderr

    Par défaut, le système Android envoie la sortie stdout et stderr (System.out et System.err)/dev/null. Dans les processus qui exécutent la machine virtuelle Dalvik, vous pouvez demander au système d'écrire une copie de la sortie dans le fichier journal. Dans ce cas, le système écrit les messages dans le journal à l'aide des balises log stdout et stderr, toutes les deux avec la priorité I.

    Pour acheminer la sortie de cette manière, vous arrêtez une instance d'émulateur/périphérique en cours d'exécution, puis vous utilisez le shell. commande setprop pour activer la redirection de sortie. Voici comment faire:

    $ adb shell stop 
        $ adb shell setprop log.redirect-stdio true 
        $ adb shell start 
    

    Le système conserve ce paramètre jusqu'à ce que vous arrêtez l'instance émulateur/appareil. Pour utiliser le paramètre par défaut sur l'émulateur/l'instance de périphérique, vous pouvez ajouter une entrée à /data/local.prop sur le périphérique.

+0

C'est exactement ce que je voulais. J'ai ajouté un fichier "local.prop" dans le dossier/data/sur l'émulateur avec la ligne: log.redirect-stdio = true Et je deviens stdout dans le journal. – erock2112

0

La journalisation est placée dans le fichier d'en-tête '#include'.

Pour lier .so, placez 'LOCAL_LDLIBS: = -L $ (SYSROOT)/usr/lib -llog' dans votre fichier make.