Il modo in cui lo fai è innanzitutto ottenere un compilatore Haskell che può indirizzare C con Android NDK che viene fornito con una porta GCC per architetture ARM. JHC può farlo banalmente con un file in stile inf molto piccolo che descrive la piattaforma (dimensioni delle parole, compilatore c, ecc.). L'ho fatto con il kit di sviluppo homebrew Wii ed è stato abbastanza semplice. Tuttavia, jhc ha ancora alcuni problemi di stabilità con codice complesso come l'utilizzo di uno stack di trasformatori monad con IO, ma jhc è migliorato molto negli ultimi 6 mesi. C'è solo una persona che lavora su JHC. Ho solo desiderato che più persone potessero aiutarlo.
L'altra opzione è quella di costruire una porta "non registrata" di GHC indirizzata a ndk gcc, questo è un processo molto più coinvolto perché GHC non è un vero cross-compilatore al momento e devi capire il sistema di costruzione di quali parti hai bisogno modificare. Un'altra opzione è NHC che può eseguire la compilazione incrociata in C, come GHC è necessario creare nhc indirizzato a un compilatore C, NHC non ha molte estensioni Haskell come GHC.
Una volta che hai il compilatore Haskell destinato a NDK GCC, dovrai scrivere i collegamenti al framework del codice della colla JNI NDK per Android (aggiunto da Android 2.3) oppure devi scrivere il codice della colla JNI tra Java-C-Haskell, la prima opzione è la più semplice soluzione e se ricordo bene potrebbe effettivamente essere retrocompatibile con le versioni precedenti di Android sotto 2.3.
Una volta ottenuto questo, è necessario creare il codice Haskell come libreria condivisa o libreria statica che viene collegata al codice colla NDK Java (che a sua volta è una libreria condivisa). Per quanto ne so, non è possibile eseguire ufficialmente eseguibili nativi su Android. Probabilmente potresti farlo con un telefono rootato, quindi presumo che ciò significhi che non puoi distribuire eseguibili nativi sull'app store anche quando la porta gcc NDK può generare eseguibili nativi bene. Questo probabilmente uccide anche l'opzione per l'utilizzo di LLVM a meno che non sia possibile far funzionare NDK JNI con LLVM.
Il più grande ostacolo non è tanto quello di ottenere un compilatore Haskell per Android (che è ancora un grande ostacolo) il problema più grande è che qualcuno ha bisogno di scrivere API vincolanti per le librerie NDK che è un compito enorme e la situazione è peggiore se si è necessario scrivere il codice dell'interfaccia utente Android perché non ci sono API NDK per questa parte dell'SDK Android. Se vuoi fare il codice dell'interfaccia utente Android in Haskell qualcuno dovrà scrivere i collegamenti Haskell su Java tramite JNI / C. A meno che non ci sia un processo più automatizzato per scrivere librerie di rilegatura (so che ce ne sono alcune, non sono abbastanza automatizzate per me), allora le possibilità che qualcuno lo faccia sono abbastanza basse.
L01man: Esiste un tutorial su come farlo? Per la prima parte, capisco che devo scaricare JHC. Cosa devo scrivere nel file inf e come usarlo?
Si prega di notare prima di rispondere a questa domanda che non uso jhc da un po 'di tempo da quando ho scritto questa versione originale e sono state rilasciate versioni più recenti da allora, quindi non so quanto sia stabile jhc attualmente quando si tratta di generare codice di programmi Haskell più complessi. Questo è un avvertimento per chiunque prima di prendere in considerazione la possibilità di creare un grande programma Haskell con JHC, è necessario eseguire alcuni piccoli test prima di proseguire.
jhc ha un manuale http://repetae.net/computer/jhc/manual.html e una sezione sull'impostazione della compilazione incrociata e del file .ini con opzioni: http://repetae.net/computer/jhc/manual .html # crosscompilation .
L01man: la seconda parte è un'alternativa alla prima. Non so come fare quello che hai detto nel terzo.
Prima di iniziare, dovresti avere qualche conoscenza di C ed essere a tuo agio con l'uso dell'interfaccia di funzione esterna (FFI) di Haskell e strumenti come hs2c. Dovresti anche avere familiarità con l'utilizzo di Android NDK e la creazione di .apk con librerie condivise. Dovrai conoscerli per interfacciarti tra C-Haskell, Java / C-Haskell e sviluppare programmi Haskell per Android che puoi distribuire / vendere ufficialmente sul market store.
L01man: Capisco che il suo obiettivo è creare un'associazione per l'API Android. Ma ... la quarta parte dice che non possiamo fare .apk con Haskell?
.apk è solo un formato di file del pacchetto di app ed è costruito con gli strumenti forniti con Android SDK (non NDK), questo ha ben poco da fare per costruire i binari stessi. I pacchetti Android possono contenere librerie condivise native, questo sarà il tuo programma Haskell e le librerie native / condivise statiche vengono generate tramite Android NDK.