Pour ce faire, vous obtenez d'abord un compilateur Haskell qui peut cibler C avec le NDK Android qui est livré avec un port GCC pour les architectures ARM. JHC peut le faire trivialement avec un très petit fichier de style inf qui décrit la plate-forme (taille des mots, compilateur c, etc.) Je l'ai fait avec le kit de développement homebrew Wii et c'était assez facile. Cependant, jhc a encore quelques problèmes de stabilité avec du code complexe comme l'utilisation d'une pile de transformateurs monade avec IO, mais jhc s'est beaucoup amélioré au cours des 6 derniers mois. Il n'y a qu'une seule personne qui travaille sur JHC. J'aurais juste souhaité que plus de personnes puissent l'aider.
L'autre option est de construire un port "non enregistré" de GHC ciblant le gcc ndk, c'est un processus beaucoup plus complexe car GHC n'est pas un vrai cross-compilateur pour le moment et vous devez comprendre le système de construction de quelles pièces vous avez besoin changement. Une autre option est NHC qui peut effectuer une compilation croisée en C, comme GHC dont vous avez besoin pour construire nhc ciblant un compilateur C, NHC n'a pas beaucoup d'extensions Haskell comme GHC.
Une fois que le compilateur Haskell cible NDK GCC, vous devrez écrire des liaisons vers le framework de code de colle NDK JNI Android (ajouté depuis Android 2.3) ou vous devez écrire du code de colle JNI entre Java-C-Haskell, la première option est la plus simple. et si je me souviens bien, il pourrait effectivement être rétrocompatible avec les versions précédentes d'Android ci-dessous 2.3.
Une fois que vous avez cela, vous devez créer du code Haskell en tant que bibliothèque partagée ou bibliothèque statique qui est liée au code de colle Java NDK (qui est lui-même une bibliothèque partagée). Pour autant que je sache, vous ne pouvez pas exécuter officiellement les exécutables natifs sur Android. Vous pourriez probablement le faire avec un téléphone rooté, donc je suppose que cela signifie que vous ne pouvez pas distribuer d'exécutables natifs sur l'App Store même lorsque le port gcc NDK peut générer très bien des exécutables natifs. Cela tue également probablement l'option d'utilisation de LLVM, sauf si vous pouvez faire fonctionner le NDK JNI avec LLVM.
Le plus grand obstacle n'est pas tant d'obtenir un compilateur Haskell pour Android (qui est toujours un gros obstacle), le plus gros problème est que quelqu'un a besoin d'écrire des API de liaison pour les bibliothèques NDK, ce qui est une tâche énorme et la situation est pire si vous besoin d'écrire le code de l'interface utilisateur Android car il n'y a pas d'API NDK pour cette partie du SDK Android. Si vous voulez faire du code d'interface utilisateur Android dans Haskell, quelqu'un devra écrire des liaisons Haskell à Java via JNI / C. À moins qu'il n'y ait un processus plus automatisé pour écrire des bibliothèques de liaisons (je sais qu'il y en a, elles ne sont tout simplement pas assez automatisées pour moi), alors les chances que quelqu'un le fasse sont assez faibles.
L01man: Existe-t-il un tutoriel sur la façon de procéder? Pour la première partie, je comprends que je dois télécharger JHC. Que dois-je écrire dans le fichier inf et comment l'utiliser?
Veuillez noter avant de répondre à cette question que je n'ai pas utilisé jhc depuis un certain temps depuis que j'ai écrit ceci et que des versions plus récentes ont été publiées depuis, donc je ne sais pas à quel point jhc est stable en ce qui concerne la génération de code de programmes Haskell plus complexes. C'est un avertissement à quiconque avant d'envisager de faire un grand programme Haskell avec JHC, vous devriez faire quelques petits tests avant de vous lancer.
jhc a un manuel http://repetae.net/computer/jhc/manual.html et une section sur la configuration de la compilation croisée et du fichier .ini avec des options: http://repetae.net/computer/jhc/manual .html # crosscompilation .
L01man: La deuxième partie est une alternative à la première. Je ne sais pas comment faire ce que tu as dit dans le troisième.
Avant de commencer, vous devez avoir une certaine connaissance de C et être à l'aise avec l'utilisation de l'interface de fonction étrangère (FFI) Haskell et des outils tels que hs2c. Vous devez également être familiarisé avec l'utilisation du NDK Android et la création de .apk avec des bibliothèques partagées. Vous devrez les connaître pour interfacer entre C-Haskell, Java / C-Haskell et développer des programmes Haskell pour Android que vous pouvez officiellement distribuer / vendre sur la boutique du marché.
L01man: Je comprends que son objectif est de créer une liaison pour l'API Android. Mais ... est-ce que la 4ème partie dit que nous ne pouvons pas faire de .apk avec Haskell?
.apk est juste un format de fichier de package d'application et est construit avec les outils fournis avec le SDK Android (pas NDK), cela a très peu à voir avec la construction des binaires eux-mêmes. Les packages Android peuvent contenir des bibliothèques natives partagées, c'est ce que sera votre programme Haskell et les bibliothèques natives partagées / statiques sont générées via Android NDK.
Un langage qui a récemment attiré mon attention est Eta .
Le compilateur d'Eta est un fork de GHC 7.10 qui a un backend JVM. Il est possible d'utiliser les fichiers JAR générés pour écrire des applications Android et même d'utiliser son interface de fonction étrangère pour appeler des bibliothèques Java Android natives.
Brian McKenna a écrit un article de blog sur la façon de configurer un projet Android Studio pour utiliser une bibliothèque Eta .
la source
Il y a https://github.com/neurocyte/android-haskell-activity démontrant l'
Haskell
exécution du code.la source
Une fois, je suis tombé sur le même fil Reddit, mais il était ancien et les commentaires étaient fermés. J'ai envoyé un message au PO, mais je ne sais pas s'il a atteint le destinataire. Ma suggestion ici (peut fonctionner pour les androïdes plus anciens où les activités natives n'étaient pas possibles).
Je (développé à Haskell il y a quelque temps, mais actuellement en Smalltalk) développe actuellement un port de Squeak VM pour Android. La façon dont je fais cela est similaire à ce qui pourrait être traité dans un projet haskell-on-android: un morceau de code C qui doit être appelé à partir de la partie Java de l'application (essentiellement tout ce qui peut être fait dans Android est de gérer divers événements; une application ne peut pas interroger elle-même les événements et n'a pas de boucle d'événements). Dans mon cas, le code est généré par les outils de construction Squeak VM, dans le cas de haskell sur Android, cela sera généré par GHC of JHC ou tout autre frontal utilisé. Ce repo peut être intéressant à regarder:
http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/project
Sous "src", il y a le code Java qui permet d'intercepter les événements utilisateur et de les envoyer au code natif (voir la classe CogView). Le code C de la VM elle-même n'est pas complètement là (voir squeakvm.org, la branche Cog pour ça), mais on peut avoir l'idée. On peut également regarder sous http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm qui est l'interface C de l'interpréteur (y compris la gestion des événements utilisateur, un certain chronométrage, etc. )
J'espère que cela t'aides.
Dmitry
la source
Il y a https://github.com/conscell/hugs-android un port d'interprète HUGS Haskell pour Android.
la source
Je pense que la réponse générale devrait provenir des transformations source-> source, car le chargement d'objets partagés spécialement compilés semble être un peu compliqué (impliquant ghc-> c et une étape c-> java dans les réponses ci-dessus). Cette question relève donc du titre de Haskell sur la JVM, qui a été essayé (avec une étape comme représentation intermédiaire Java) et longuement discuté . Vous pouvez utiliser frege si les bibliothèques dont vous avez besoin s'y compilent. Les seules étapes restantes seraient les débuts de l'API Android Framework traduits en actions IO () et peut-être un wrapper pour la construction du manifeste xml et apk.
la source