Dazu erhalten Sie zunächst einen Haskell-Compiler, der mit dem Android-NDK, das über einen GCC-Port für ARM-Architekturen verfügt, auf C abzielen kann. JHC kann dies trivial mit einer sehr kleinen Datei im Inf-Stil tun, die die Plattform beschreibt (Wortgröße, C-Compiler usw.). Ich habe dies mit dem Wii-Homebrew-Entwicklungskit gemacht und es war ziemlich einfach. Allerdings hat jhc immer noch einige Stabilitätsprobleme mit komplexem Code, wie die Verwendung eines Monadentransformatorstapels mit E / A, aber jhc hat sich in den letzten 6 Monaten stark verbessert. Es gibt nur eine Person, die an JHC arbeitet. Ich wünschte nur, mehr Menschen könnten ihm helfen.
Die andere Möglichkeit besteht darin, einen "nicht registrierten" GHC-Port zu erstellen, der auf das ndk gcc abzielt. Dies ist ein viel komplizierterer Prozess, da GHC derzeit kein echter Cross-Compiler ist und Sie das Build-System verstehen müssen, welche Teile Sie benötigen Veränderung. Eine weitere Option ist NHC, das mit C überkompiliert werden kann. Wie GHC müssen Sie nhc für einen C-Compiler erstellen. NHC verfügt nicht über viele Haskell-Erweiterungen wie GHC.
Sobald Sie einen Haskell-Compiler haben, der auf NDK GCC abzielt, müssen Sie Bindungen entweder an das Android NDK JNI-Klebercode-Framework (hinzugefügt seit Android 2.3) schreiben oder JNI-Klebercode zwischen Java-C-Haskell schreiben. Die erstere Option ist die einfachere Lösung und wenn ich mich richtig erinnere, könnte tatsächlich abwärtskompatibel mit früheren Versionen von Android unter 2.3 sein.
Sobald Sie dies haben, müssen Sie Haskell-Code als gemeinsam genutzte Bibliothek oder statische Bibliothek erstellen, die mit dem NDK-Java-Klebercode (der selbst eine gemeinsam genutzte Bibliothek ist) verknüpft wird. Soweit mir bekannt ist, können Sie native ausführbare Dateien auf Android nicht offiziell ausführen. Sie könnten dies wahrscheinlich mit einem gerooteten Telefon tun, daher gehe ich davon aus, dass Sie keine nativen ausführbaren Dateien im App Store verteilen können, selbst wenn der NDK-gcc-Port native ausführbare Dateien problemlos generieren kann. Dies macht wahrscheinlich auch die Option für die Verwendung von LLVM zunichte, es sei denn, Sie können das NDK-JNI mit LLVM arbeiten lassen.
Die größte Hürde besteht nicht darin, einen Haskell-Compiler für Android zu bekommen (was immer noch eine große Hürde ist). Das größte Problem ist, dass jemand Bindungs-APIs für NDK-Bibliotheken schreiben muss, was eine große Aufgabe ist und die Situation schlimmer ist, wenn Sie Ich muss Android-UI-Code schreiben, da es für diesen Teil des Android-SDK keine NDK-APIs gibt. Wenn Sie Android-UI-Code in Haskell erstellen möchten, muss jemand Haskell-Bindungen über JNI / C an Java schreiben. Wenn das Schreiben von Bindungsbibliotheken nicht automatisierter ist (ich weiß, dass es einige gibt, sie sind für mich einfach nicht automatisiert genug), sind die Chancen, dass jemand dies tut, recht gering.
L01man: Gibt es ein Tutorial dazu? Für den ersten Teil verstehe ich, dass ich JHC herunterladen muss. Was muss ich in die inf-Datei schreiben und wie benutze ich sie?
Bitte beachten Sie, bevor ich diese Frage beantworte, dass ich jhc seit einiger Zeit nicht mehr verwendet habe, seit ich dies ursprünglich geschrieben habe. Seitdem wurden neuere Versionen veröffentlicht, sodass ich nicht weiß, wie stabil jhc derzeit ist, wenn es um die Codegenerierung komplexerer Haskell-Programme geht. Dies ist eine Warnung für alle, bevor Sie überlegen, ein großes Haskell-Programm mit JHC zu erstellen. Sie sollten einige kleine Tests durchführen, bevor Sie fortfahren.
jhc verfügt über ein Handbuch http://repetae.net/computer/jhc/manual.html und einen Abschnitt zum Einrichten der Cross-Compilation- und INI-Datei mit den folgenden Optionen: http://repetae.net/computer/jhc/manual .html # Crosscompilation .
L01man: Der zweite Teil ist eine Alternative zum ersten. Ich weiß nicht, wie ich das tun soll, was du im dritten gesagt hast.
Bevor Sie beginnen, sollten Sie über Kenntnisse in C verfügen und mit der Verwendung der Haskell Foreign Function Interface (FFI) und Tools wie hs2c vertraut sein. Sie sollten auch mit der Verwendung des Android NDK und dem Erstellen von .apk mit gemeinsam genutzten Bibliotheken vertraut sein. Sie müssen diese kennen, um eine Schnittstelle zwischen C-Haskell, Java / C-Haskell herzustellen und Haskell-Programme für Android zu entwickeln, die Sie offiziell im Market Store vertreiben / verkaufen können.
L01man: Ich verstehe, dass das Ziel darin besteht, eine Bindung für die Android-API zu erstellen. Aber ... sagt der 4. Teil, dass wir mit Haskell kein .apk machen können?
.apk ist nur ein App-Paket-Dateiformat und basiert auf den Tools, die mit dem Android SDK (nicht NDK) geliefert werden. Dies hat sehr wenig mit dem Erstellen der Binärdateien selbst zu tun. Android-Pakete können native gemeinsam genutzte Bibliotheken enthalten. Dies ist das, was Ihr Haskell-Programm sein wird, und die nativen gemeinsam genutzten / statischen Bibliotheken werden über das Android-NDK generiert.