Je suis très nouveau dans tout ce support gradle et Android Studio. J'ai réussi à convertir mon projet Android en gradle en utilisant l'option d'exportation.
Mais je recherche de la documentation ou un point de départ sur la façon d'intégrer la construction NDK dans le processus de construction gradle.
Si possible, j'ai également besoin d'une sorte d'étape «après» qui copie les binaires de construction (fichiers .so) dans le répertoire des ressources.
android
android-ndk
gradle
android-studio
plaisthos
la source
la source
Réponses:
Nous avons publié une première version de l'intégration en avant-première dans la version 1.3: http://tools.android.com/tech-docs/android-ndk-preview
L'intégration restera un aperçu même après que la version 1.3 devienne définitive. Pas d'ETA actuelle quant à la date de sa fin (à partir du 10/07/2015).
Plus d'informations ici: http://tools.android.com/tech-docs/android-ndk-preview
la source
MISE À JOUR: Le studio Android avec prise en charge NDK est maintenant disponible: http://tools.android.com/tech-docs/android-ndk-preview
Pour construire avec un script, la solution gradle ci-dessous devrait fonctionner:
J'utilise mon script de construction et je l'ai ajouté à mon fichier (semble fonctionner pour
0.8+
): Cela semble être équivalent à la solution ci-dessous (mais semble plus agréable dans le fichier gradle):La construction n'échoue malheureusement pas si le répertoire n'est pas présent ou ne contient aucun
.so
fichier.la source
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { it.jniFolders = [file("libs")] as Set }
. Merci les gars pour votre aide!jni.srcDirs = [] //disable automatic ndk-build
est très importante car elle empêchera Android Studio de reconstruire le code source C / C ++. J'essaie de comprendre cela depuis deux jours jusqu'à ce que je voie votre message et que cela résout mon problème. Je pense vraiment que la version NDK est mieux construite séparément par le makefile de la ligne de commande Android.mk uniquement, pas par le script gradle puisque C / C ++ a été construit par Makefile depuis plus de 40 ans!Avec la mise à jour d'Android Studio vers 1.0, le support de la chaîne d'outils NDK s'est énormément amélioré ( note: veuillez lire mes mises à jour au bas de cet article pour voir l'utilisation avec le nouveau plugin expérimental Gradle et Android Studio 1.5 ).
Android Studio et le NDK sont suffisamment bien intégrés pour qu'il vous suffise de créer un bloc ndk {} dans le build.gradle de votre module et de définir vos fichiers source dans le répertoire (module) / src / main / jni - et vous êtes terminé!
Plus de ndk-build à partir de la ligne de commande.
J'ai tout écrit à ce sujet dans mon article de blog ici: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/
Les points saillants sont:
et mettez ceci dans build.gradle de votre module:
C'est le processus de compilation de votre code C ++, à partir de là, vous devez le charger et créer des wrappers - mais à en juger par votre question, vous savez déjà comment faire tout cela, donc je ne re-hacherai pas.
De plus, j'ai placé un dépôt Github de cet exemple ici: http://github.com/sureshjoshi/android-ndk-swig-example
MISE À JOUR: 14 juin 2015
Lorsque Android Studio 1.3 sortira, il devrait y avoir une meilleure prise en charge de C ++ via le plugin JetBrains CLion. Je suppose actuellement que cela permettra le développement Java et C ++ à partir d'Android Studio; Cependant, je pense que nous devrons toujours utiliser la section Gradle NDK comme je l'ai indiqué ci-dessus. De plus, je pense qu'il sera toujours nécessaire d'écrire des fichiers wrapper Java <-> C ++, à moins que CLion ne le fasse automatiquement.
MISE À JOUR: 5 janvier 2016
J'ai mis à jour mon blog et mon dépôt Github (dans la branche de développement) pour utiliser Android Studio 1.5 avec le dernier plugin expérimental Gradle (0.6.0-alpha3).
http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/ http://github.com/sureshjoshi/android-ndk-swig-example
La construction Gradle pour la section NDK ressemble maintenant à ceci:
De plus, tout à fait incroyable, Android Studio a une saisie semi-automatique pour C ++ - les wrappers générés par Java à l'aide du mot-clé `` natif '':
Cependant, ce n'est pas tout à fait rose ... Si vous utilisez SWIG pour envelopper une bibliothèque afin de générer automatiquement du code, puis essayez d'utiliser la génération automatique de mot-clé natif, cela mettra le code au mauvais endroit dans votre Swig _wrap Fichier .cxx ... Vous devez donc le déplacer dans le bloc "extern C":
MISE À JOUR: 15 octobre 2017
Je m'en voudrais de ne pas mentionner qu'Android Studio 2.2 et les versions ultérieures ont essentiellement un support `` natif '' (sans jeu de mots) pour la chaîne d'outils NDK via Gradle et CMake. Maintenant, lorsque vous créez un nouveau projet, sélectionnez simplement le support C ++ et vous êtes prêt à partir.
Vous devrez toujours générer votre propre code de couche JNI ou utiliser la technique SWIG que j'ai mentionnée ci-dessus, mais l'échafaudage d'un projet C ++ dans Android est désormais trivial.
Les modifications dans le fichier CMakeLists (où vous placez vos fichiers source C ++) seront récupérées par Android Studio, et il recompilera automatiquement toutes les bibliothèques associées.
la source
Dans Google IO 2015, Google a annoncé l'intégration complète de NDK dans Android Studio 1.3.
Il est désormais hors aperçu et accessible à tous: https://developer.android.com/studio/projects/add-native-code.html
Ancienne réponse: Gradle appelle automatiquement
ndk-build
si vous avez unjni
répertoire dans les sources de votre projet.Cela fonctionne sur le studio Android 0.5.9 (version Canary).
Téléchargez le NDK
Ajoutez
ANDROID_NDK_HOME
à vos variables d'environnement ou ajoutezndk.dir=/path/to/ndk
à votrelocal.properties
dans votre projet Android Studio. Cela permet au studio Android d'exécuter automatiquement le ndk.Téléchargez les derniers exemples de projets Gradle pour voir un exemple de projet ndk. (Ils sont au bas de la page). Un bon exemple de projet est
ndkJniLib
.Copiez le à
gradle.build
partir des exemples de projets NDK. Cela ressemblera à quelque chose comme ça. Celagradle.build
crée un apk différent pour chaque architecture. Vous devez sélectionner l'architecture souhaitée à l'aide dubuild variants
volet.Notez que cela ignorera vos fichiers Android.mk et Application.mk. Pour contourner ce problème, vous pouvez demander à gradle de désactiver l'appel ndk-build atuomatic, puis spécifier manuellement le répertoire des sources ndk.
De plus, vous voudrez probablement appeler explicitement ndk-build dans votre script de construction gradle, car vous venez de désactiver l'appel automatique.
la source
tasks.all { task -> if (task.name.contains('Ndk')) task.enabled = false }
J'ai trouvé que "gradle 1.11 com.android.tools.build:gradle:0.9.+" prend en charge la pré-construction ndk maintenant, vous pouvez simplement mettre le * .so dans le dir src / main / jniLibs. lors de la construction, gradle emballera le ndk au bon endroit.
voici mon projet
la source
Comme l'a dit Xavier, vous pouvez mettre vos préconfigurations dans / src / main / jniLibs / si vous utilisez gradle 0.7.2+
extrait de: https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ
la source
Pour le moment (Android Studio v0.8.6), c'est assez simple. Voici les étapes pour créer une application de type "Hello world":
Téléchargez le NDK Android et placez le dossier racine dans un endroit sain - au même emplacement que le dossier SDK, peut-être.
Ajoutez ce qui suit à votre
local.properties
fichier:ndk.dir=<path-to-ndk>
Ajoutez ce qui suit à votre fichier build.gradle à l'intérieur de la
defaultConfig
fermeture, juste après laversionName
ligne:ndk { moduleName="hello-world" }
Dans le
main
répertoire de votre module d'application , créez un nouveau dossier appeléjni
.Dans ce dossier, créez un fichier appelé
hello-world.c
, que vous verrez ci-dessous.Voir l'exemple de
Activity
code ci-dessous pour un exemple de la façon d'appeler une méthode (ou est-ce une fonction?) Danshello-world.c
.hello-world.c
MainActivity.java
build.gradle
Trouvez le code source complet d'une application très similaire ici (moins le NDK).
la source
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI
pour la vôtre :)Si vous êtes sous unix, la dernière version (0.8) ajoute ndk-build. Voici comment l'ajouter:
Il s'attend à trouver le JNI sous 'src / main / jni', sinon vous pouvez le définir avec:
Depuis le 28 JAN 2014 avec la version 0.8, la build est interrompue sous Windows, vous devez désactiver la build avec:
la source
Une solution de contournement élégante est présentée dans https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J .
Fondamentalement, vous créez un fichier jar contenant "lib / armeabi / yourlib.so", puis vous incluez le fichier jar dans la construction.
la source
ndk-build
, génère des.jar
s pour chacun.so
et les place dans le chemin de construction de gradle pour soulager cette douleur. Vérifiez-le.Une bonne réponse automatisant l'empaquetage de
.so
fichiers -fichiers facilement compilés est donnée dans un autre thread (fermé) . Pour que cela fonctionne, j'ai dû changer la ligne:dans:
Sans cette modification, les
.so
fichiers n'ont pas été trouvés et la tâche de les empaqueter ne serait donc jamais exécutée.la source
La réponse de @plaisthos a éclaté dans la dernière version de Gradle, mais il y a toujours un moyen de le faire. Créez un
native-libs
répertoire à la racine de votre répertoire de projet et copiez toutes vos bibliothèques dans ce répertoire.Ajoutez les lignes suivantes à votre build.gradle. Construisez et soyez heureux.
la source
C'est le code que j'utilise pour créer en utilisant android-ndk de gradle. Pour cela, ajoutez le chemin du répertoire ndk dans
gradle.properties
ie. ajouterndkdir=/home/user/android-ndk-r9d
et de mettre tous les fichiers JNI dans un dossiernative
ensrc/main/
tant que vous pouvez voir à partir du code affiché ci - dessous. Il créera un fichier jar avec des bibliothèques natives que vous pouvez utiliser normalement comme dansSystem.loadLibrary("libraryname");
la source
J'ai utilisé le code suivant pour compiler des bibliothèques de dropbox natives, j'utilise Android Studio v1.1.
la source
J'ai utilisé
ndk.dir=/usr/shareData/android-ndk-r11b
// chemin de ndkdans le fichier local.properties dans le projet Android Studio. et ajoutez cette ligne:
android.useDeprecatedNdk=true
dans le fichier gradle.properties dans le projet android studio.
Plus d'informations ici: http://tools.android.com/tech-docs/android-ndk-preview
la source
Pour développer ce que Naxos a dit (merci Naxos de m'avoir envoyé dans la bonne direction!), J'ai beaucoup appris des exemples NDK récemment publiés et j'ai posté une réponse dans une question similaire ici.
Comment configurer NDK avec le plugin Android Gradle 0.7
Cet article contient des détails complets sur la liaison des bibliothèques natives prédéfinies dans votre application pour les différentes architectures, ainsi que des informations sur la façon d'ajouter la prise en charge NDK directement au script build.gradle. Pour la plupart, vous ne devriez plus avoir à faire le travail autour du zip et de la copie.
la source
Voici les étapes que j'ai utilisées pour faire fonctionner le NDK dans mon projet Android Studio. J'ai utilisé ce tutoriel pour m'aider https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio
Pour utiliser NDK, vous devez ajouter une ligne NDK à local.properties. Alors sous votre sdk.dir ajoutez
Dans mes applications build.gradle, j'ai le code suivant
moduleName est le nom que vous souhaitez donner à votre code natif. Je crois que c'est ainsi que s'appellera la bibliothèque partagée. ldLibs me permet de me connecter à LogCat, stl est le stl que vous souhaitez importer. Il existe de nombreuses options, comme l'Eclipse NDK. ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html )
Les cFlags sont encore pour moi une certaine quantité de magie noire. Je n'ai pas trouvé une bonne source pour toutes les options et ce qu'elles me donnent. Recherchez dans StackOverflow tout ce dont vous avez besoin, c'est là que je l'ai trouvé. Je sais que le c ++ 11 me permet d'utiliser le nouveau standard c ++ 11.
Voici un exemple de la façon dont je me connecte à LogCat à partir du code natif
la source
configurer le projet dans android studio depuis eclipse: vous devez importer le projet eclipse ndk vers android studio sans exporter vers gradle et cela fonctionne, vous devez également ajouter le chemin de ndk dans local.properties , si affiche une erreur, ajoutez
dans le fichier build.gradle , puis créez un dossier et un fichier jni à l' aide du terminal et exécutez-le fonctionnera
la source
Maintenant qu'Android Studio est dans le canal stable, il est assez simple d' exécuter les exemples android-ndk . Ces exemples utilisent le plugin expérimental ndk et sont plus récents que ceux liés à la documentation en ligne Android NDK. Une fois que vous savez qu'ils fonctionnent, vous pouvez étudier les fichiers build.gradle, local.properties et gradle-wrapper.properties et modifier votre projet en conséquence. Voici les étapes pour les faire fonctionner.
Accédez aux paramètres, apparence et comportement, paramètres système, Android SDK, sélectionnez l'onglet Outils SDK et vérifiez la version 1.0.0 d'Android NDK au bas de la liste. Cela téléchargera le NDK.
Pointez sur l'emplacement du NDK nouvellement téléchargé. Notez qu'il sera placé dans le répertoire sdk / ndk-bundle. Pour ce faire, sélectionnez Fichier, Structure du projet, Emplacement du SDK (à gauche) et indiquez un chemin sous l'emplacement NDK Android. Cela ajoutera une entrée ndk à local.properties semblable à ceci:
J'ai construit et déployé avec succès tous les projets dans le référentiel de cette façon, à l'exception de gles3gni, native-codec et builder. J'utilise ce qui suit:
Android Studio 1.3 build AI-141.2117773
échantillons android-ndk publiés le 28 juillet 2015 (lien ci-dessus)
SDK Tools 24.3.3
NDK r10e extrait vers C: \ Android \ sdk \ ndk-bundle
Gradle 2.5
Gradle plugin 0.2.0
Windows 8.1 64 bit
la source
NDK Builds et gradle (basique)
En général, la construction avec le NDK est aussi simple que de spécifier correctement un chemin ndkBuild vers Android.mk ou un chemin cmake vers CMakeLists.txt. Je recommande CMake par rapport à l'ancien Android.mk car le support C / C ++ d'Android Studio est basé sur CLion et utilise CMake comme format de projet. Cela, d'après mon expérience, a eu tendance à rendre l'EDI plus réactif sur des projets plus importants. Tout ce qui est compilé dans votre projet sera construit et copié automatiquement dans l'APK.
Ajout de bibliothèques prédéfinies au projet (avancé)
Les bibliothèques statiques (.a) de votre build NDK seront automatiquement incluses, mais les bibliothèques dynamiques prédéfinies (.so) devront être placées dans
jniLibs
. Cela peut être configuré en utilisantsourceSets
, mais vous devez adopter la norme. Vous N'AVEZ PAS BESOIN de commandes supplémentairesbuild.gradle
lors de l'inclusion de bibliothèques prédéfinies.La disposition de
jniLibs
Vous pouvez trouver plus d'informations sur la structure dans le Guide de l'utilisateur du plugin Android Gradle .
Vous pouvez ensuite valider l'APK résultant contenant vos fichiers .so, généralement sous
build/outputs/apk/
, en utilisantunzip -l myApp.apk
pour lister le contenu.Construire des bibliothèques partagées
Si vous créez une bibliothèque partagée dans le NDK, vous n'avez rien d'autre à faire. Il sera correctement regroupé dans l'APK.
la source
Ajoutez simplement ces lignes à l'application
build.gradle
la source
maintenant, je peux charger le si succès!
1. ajoutez le fichier .so à ce chemin
| --src | - | --main | - | - | --java | - | - | --jniLibs | - | - | - | --armeabi | - | - | - | - | -. so fichiers
2. ajoutez ce code à gradle.build
}
3.
System.loadLibrary("yousoname");
la source
Si votre projet a été exporté depuis eclipse, ajoutez les codes ci-dessous dans le fichier gradle :
2.Si vous créez un projet dans le studio Android:
créez un dossier nommé jniLibs dans src / main / , et placez vos fichiers * .so dans le dossier jniLibs.
Et copiez le code comme ci-dessous dans votre fichier gradle :
la source
Bien que je pense que SJoshi (oracle guy) a la réponse la plus complète, le projet SWIG est un cas particulier, intéressant et utile, mais pas généralisé pour la majorité des projets qui ont bien fonctionné avec les projets SDK standard basés sur les fourmis + NDK. Nous aimerions tous utiliser le studio Android maintenant très probablement, ou voulons une chaîne d'outils de construction plus conviviale pour les CI pour mobile, ce que gradle propose théoriquement.
J'ai publié mon approche, empruntée à quelque part (j'ai trouvé cela sur SO, mais j'ai publié un résumé de l'application build.gradle: https://gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841 ). En un mot, je recommande ce qui suit:
Gradle pour Android a été un gâchis à mon avis, tout comme j'aime les concepts maven empruntés et la structure opiniâtre des répertoires pour un projet. Cette fonctionnalité NDK est "à venir" depuis presque 3+ ans.
la source