Je développe une application Android à l'aide de NDK. J'ai deux projets. L'un est pour ma bibliothèque native qui utilise NDK et génère un fichier .so.
J'utilise Android Studio mais je désactive la construction automatique et la construction activée à l'aide de ndk-build. J'utilise Windows 7.
Maintenant, après avoir généré le fichier .so, je les copie dans mon projet d'application principal qui utilise également ndk-build pour compiler les fonctions JNI dans lesquelles j'appelle les fonctions de ma bibliothèque. J'espère que je suis propre jusqu'à ce point. Sinon, je donnerai plus de détails sur demande.
Maintenant, j'exécute mon application dans un appareil utilisant Android Studio et je peux mettre un point d'arrêt dans le code Java et le déboguer, mais je ne suis pas en mesure de déboguer les appels JNI et le code natif que j'ai dans un projet séparé. J'ai besoin de déboguer à l'intérieur de mon code de bibliothèque. Alors, y a-t-il un moyen d'y parvenir?
J'ai vu VisualGDB mais c'est payé. Alors laissez-moi savoir s'il existe une alternative pour remplir pleinement mes exigences de débogage. J'ai cherché beaucoup mais n'ai pas trouvé de solution concrète.
Je peux voir une option dans Android Studio pour la connexion au processus Android où je peux voir mon périphérique en cours d'exécution, mais je ne sais pas comment l'utiliser pour pouvoir déboguer par le code de la bibliothèque native (qui est dans un projet séparé sans aucune activité).
Faites-moi savoir si plus de détails sont requis
Dans Android Studio 2.0, le processus est un peu différent (plus simple, je pense):
Si cela ne fonctionne pas, vérifiez que votre configuration native a le type de débogage "Hybrid" selected: à droite du bouton de lecture, cliquez sur le petit triangle, sélectionnez "Edit Configurations", sélectionnez votre "app-native" configuration, allez dans l'onglet "Débogueur" et sélectionnez "Type de débogage: Hybride".
Android Studio 1.3+ prend en charge le débogage natif.
Pour le configurer, procédez comme suit:
- Modifiez votre fichier gradle-wrapper.properties, local.properties et les deux fichiers build.gradle, comme indiqué dans ce guide .
- Graduation de synchronisation
Créez et sélectionnez une nouvelle configuration de construction:
Cliquez sur le menu déroulant à côté du bouton Exécuter) -> Modifier les configurations, cliquez sur le signe plus, choisissez Android Native, indiquez les options à droite (j'ai utilisé LLDB dans l'onglet du débogueur natif), et vous devriez être défini.
Définir des points d'arrêt en C++
- Appuyez sur le bouton de débogage et soyez patient (le débogueur prend parfois un certain temps)
J'ai pu déboguer du code natif sous Lubuntu 14.04 avec Android Studio 1.3 (canal stable). Bien que d'autres aient soi-disant réussi sous Windows, je n'ai pas été en mesure de déboguer de manière native sous Windows 8.1 (j'ai essayé avec Android Studio 1.3, 1.3.2 et 1.4 preview 3).
Mise à jour Android Studio 1.4 Beta vient de sortir. Je l'ai testé et j'ai pu déboguer nativement sous Windows 8.1.
J'ai pu définir des points d'arrêt et entrer dans le code natif, mais uniquement lorsque toutes les conditions suivantes étaient remplies:
Cela fonctionne pour moi en ce moment dans Android Studio 1.5, en utilisant le Gradle Experimental Plugin
Un autre point de contrôle si les points d'arrêt dans les codes natifs ne fonctionnent pas:
Android:extractNativeLibs="false"
ou donnez-lui la valeur true dans AndroidManifest.xmlextractNativeLibs="false"
provoque 1 ou 2, occasionnellement.
Si votre point d'arrêt natif ne peut toujours pas être touché après avoir tout essayé ET que, par hasard, votre bibliothèque native ait été référencée sur plusieurs projets AS, il existe une solution simple.
Il suffit de renommer votre bibliothèque native dans setting.gradle et votre build.gradle
Avant:
//in setting.gradle
include ":myNativeLib"
project(":myNativeLib").projectDir = new File("...")
//in app's build.gradle
api project(':myNativeLib')
Après:
//in setting.gradle
include ":myNativeLib2"
project(":myNativeLib2").projectDir = new File("...")
//in app's build.gradle
api project(':myNativeLib2')