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.