J'écris une application Android qui inclut du code C/C++ qui est compilé avec le code Java. Mon application se bloque lors de l'exécution du code natif.
Existe-t-il un moyen de parcourir la source Android C/C++ et d'inspecter les variables comme cela est possible avec une source Java?
Je ne cherche pas nécessairement un moyen de parcourir les sources depuis Android Studio. C'est évidemment la solution idéale. Cependant, si je dois utiliser un outil externe après avoir démarré l'application depuis Studio, c'est très bien. Je veux pouvoir effectuer une exécution ligne par ligne et inspecter des variables.
Android Studio 1.0.2
Android NDK r10d
Edit: En raison de la réponse immédiate de "Utiliser Eclipse avec le plugin ADT", permettez-moi d'ajouter des exigences supplémentaires.
Ce projet a démarré en tant que projet Eclipse ADT. Cependant, j'ai maintenant migré vers Android Studio. Mon projet est maintenant construit avec Gradle et la structure de répertoire de mon projet en tient compte. Je suis disposé à utiliser Eclipse; Je suis pas disposé à modifier la structure de mon projet afin de revenir à Eclipse à partir d'Android Studio. S'il existe un moyen d'ouvrir le projet Android Studio dans Eclipse et de le déboguer de cette façon, veuillez expliquer le processus.
À partir de la version 1.3+ Preview, Android Studio prend en charge le débogage C++, en citant Android M Developer Preview & Tools :
Le plus notable est une fonctionnalité très demandée par nos développeurs Android NDK et jeux: l'édition de code et le débogage pour le code C/C++. Basé sur la plate-forme JetBrains Clion, le plug-in Android Studio NDK fournit des fonctionnalités telles que le refactoring et la complétion de code pour le code C/C++ aux côtés de votre code Java. La prise en charge des codes Java et C/C++ est intégrée dans une seule expérience de développement gratuite pour les développeurs d'applications Android.
[METTRE À JOUR]
À compter de juillet 2015, Android Studio DOIT prendre en charge NDK.
Vous pouvez en apprendre plus à ce sujet sur ce lien .
[OLD] NDK n'est pas encore pris en charge dans Android Studio.
Lorsque nous devons traiter avec NDK, la seule solution consiste à utiliser Eclipse.
MODIFIER
Nous conservons essentiellement le projet Eclipse avec l’entité NDK (carte dans notre cas) et le projet Gradle avec d’autres entités (non cartographiques). Donc, tout ce qui doit être fait avec NDK, nous le faisons dans Eclipse, puis nous incluons les modifications dans le projet Gradle.
Pour être plus précis, dans le répertoire /src/main/
, nous avons créé un autre répertoire appelé jniLibs
et avons placé le fichier *.so
compilé dans des dossiers spécifiques à l'architecture (armeabi-v7a, armeabi, x86, etc.). Ensuite, dans la classe principale du projet Gradle, il a simplement ajouté une ligne
static {
System.loadLibrary("OurNDKLibName");
}
Vous pouvez ajouter cette ligne une seule fois par projet. Je me trompe peut-être mais nous n’avons eu aucun problème à le faire.
Il n'est pasn'était pas ne fonctionne pas très bien.
bonjour-jni échoue a échoué avec:
Starting LLDB server: run-as com.example.sample
/data/data/com.example.sample/lldb/bin/start_lldb_server.sh
/data/data/com.example.sample/lldb
/data/data/com.example.sample/lldb/tmp/platform.port1442695333842 "lldb
process:gdb-remote packets"
Error while launching debug server on device:
com.Android.tools.ndk.run.DebuggerContext$StartServerException:
Java.lang.IllegalStateException: Failed to read platform port
/data/data/com.example.sample/lldb/tmp/platform.port1442695333842
J'utilise 1.4RC1
compileSdkVersion 23
buildToolsVersion "23.0.1"
Et la configuration d'exécution "native" de l'application mentionnée par @Gerry. C'est presque là, mais je ne trouve aucune trace d'un répertoire lldb
dans le dossier de données privé de mon application. Je trouve un 400 kb gdbserver dans le répertoire lib
lié à partir de là, avec mon propre droit *.so
à côté. Malheureusement, l'option de débogage avec gdb au lieu de lldb est allée de pair avec la mise à niveau de 1.3 à 1.4. NDK 10e expédie un binaire de 400kb gdbserver dans ndk\prebuilt\Android-arm\gdbserver
dont il s’agit (je suppose). Le 15 septembre, le guide de débogage gdb https://github.com/mapbox/mapbox-gl-native/wiki/Android-debugging-with-remote-GDB a été mis à jour. C'est plus difficile que de déboguer logcat IMO, mais un sujet d'actualité, désolé d'être aussi négatif, mais je ne crois pas que lldb fonctionne encore pour le moment.
J'ai couru bonjour et je suis arrivé à la même conclusion.
Donc, pour répondre à votre question, il n’est pas encore possible de déboguer C/C++ dans Android Studio. Désolé, ce n’était pas la réponse que vous espériez et j’espère avoir tort, avec des preuves concluantes du contraire, mais ici et maintenant, aucune chance!
UPDATE J'ai soulevé un problème où un correctif a été attribué à un téléphone.
UPDATE2 Il est trop tôt pour le dire, il s'agit d'une expérience, mais je ne parviens parfois pas à établir la connexion, souvent même si je ne parviens pas toujours à obtenir une marche au ralenti et des points d'arrêt avec des valeurs de paramètre non-sens. Je viens de définir un point d'arrêt conditionnel qui ne s'est pas déclenché, mais le logcat indique qu'il le devrait. Au départ, j'ai supposé que c'était mon erreur logique, mais cela va plus loin.
Toucher des points d'arrêt est très utile, mais il reste encore un million de kilomètres à perdre du débogage Java ou du débogage Vis Studio C++.
UPDATE3 Revenons à la version 1.3.1 stable, car la version de la chaîne canaray était suspendue pendant une pause dans les toilettes à chaque frappe. Bien que la version de débogage native au moins soit lancée avec mon téléphone "fixe", aucun point d'arrêt n'est atteint, même dans hellojni, ou une version légèrement étendue pour donner plus de possibilités. Je suis habitué à logcat maintenant, mais j'ai eu de meilleures expériences de débogage avec Android, NDK et Eclipse. Une solution plus élaborée est également plus facile à résoudre, mais au moins elle fonctionne.
Oui, Android Studio prend en charge le débogage C++ au moins avec Android studio 1.5.1 et Android-ndk-r10e.
Auparavant, vous devrez écrire les fichiers de compilation Android.mk et Application.mk pour générer le code C++ dans Android Studio. Vous n'en avez plus besoin. Tant que vous les placerez dans le dossier jni, gradle sera en mesure de le récupérer et de le compiler. Vous devriez voir quelque chose comme ce qui suit:
Et vous permettent également de définir un point d'arrêt et de le déboguer.
Vous devez suivre ce didacticiel pas à pas et en apprendre davantage à ce sujet. Et en savoir plus sur la documentation ici . J'ai téléchargé un exemple de travail complet afin que vous puissiez le télécharger et l'essayer sur GitHub .
Avec Android Studio 1.4 à partir de tools.Android.com, le débogage est possible. Lorsque vous ouvrez/créez un projet contenant du code C++ [jni], le studio Android crée une nouvelle configuration, similaire à $ (nom_du_module) -native.
Je voudrais sélectionner cette configuration, synchroniser le dégradé, construire, définir un point d'arrêt, etc. et l'exécuter avec Android Studio. Après une longue attente, mon débogueur est connecté, l'application est cassée dans [je pense que vous pouvez également définir un point d'arrêt à ce moment-là]; cette pause n'est pas à mes points d'arrêt définis, je l'ai laissé aller dans le studio Android et mon point d'arrêt est atteint. J'espère que cela t'aides
Quelques exemples sont supposés fonctionner avec le débogueur Android