La forma de hacerlo es obtener primero un compilador Haskell que pueda apuntar a C con el NDK de Android que viene con un puerto GCC para arquitecturas ARM. JHC puede hacer esto trivialmente con un archivo de estilo inf muy pequeño que describe la plataforma (tamaño de palabra, compilador c, etc.) Lo hice con el kit de desarrollo homebrew de Wii y fue bastante fácil. Sin embargo, jhc todavía tiene algunos problemas de estabilidad con el código complejo, como el uso de una pila de transformador de mónada con IO, pero jhc ha mejorado mucho en los últimos 6 meses. Solo hay una persona trabajando en JHC. Solo deseaba que más personas pudieran ayudarlo.
La otra opción es construir un puerto "no registrado" de GHC dirigido al ndk gcc, este es un proceso mucho más complicado porque GHC no es un verdadero compilador cruzado en este momento y necesita comprender el sistema de compilación qué partes necesita cambio. Otra opción es NHC, que puede compilarse de forma cruzada con C, como GHC necesita compilar nhc apuntando a un compilador de C, NHC no tiene muchas extensiones Haskell como GHC.
Una vez que tenga el compilador Haskell dirigido a NDK GCC, deberá escribir enlaces en el marco de código de pegamento JNI de Android NDK (agregado desde Android 2.3) o debe escribir código de pegamento JNI entre Java-C-Haskell, la primera opción es la más fácil solución y si no recuerdo mal, en realidad podría ser compatible con versiones anteriores de Android anteriores a la 2.3.
Una vez que tenga esto, debe compilar el código Haskell como biblioteca compartida o biblioteca estática que se vincula al código de pegamento NDK java (que en sí mismo es una biblioteca compartida). Que yo sepa, no puedes ejecutar oficialmente ejecutables nativos en Android. Probablemente podría hacerlo con un teléfono rooteado, por lo tanto, supongo que esto significa que no puede distribuir ejecutables nativos en la tienda de aplicaciones incluso cuando el puerto NDK gcc puede generar ejecutables nativos muy bien. Esto probablemente también elimina la opción de usar LLVM a menos que pueda hacer que el NDK JNI funcione con LLVM.
El mayor obstáculo no es tanto obtener un compilador Haskell para Android (que sigue siendo un gran obstáculo), el mayor problema es que alguien necesita escribir API vinculantes para bibliotecas NDK, lo cual es una tarea enorme y la situación es peor si usted es necesario escribir el código de la interfaz de usuario de Android porque no hay API NDK para esta parte del SDK de Android. Si desea hacer código de interfaz de usuario de Android en Haskell, alguien tendrá que escribir enlaces de Haskell a Java a través de JNI / C. A menos que haya un proceso más automatizado para escribir bibliotecas vinculantes (sé que hay algunas, simplemente no están lo suficientemente automatizadas para mí), entonces las posibilidades de que alguien lo haga son bastante bajas.
L01man: ¿Hay un tutorial sobre cómo hacer esto? Para la primera parte, entiendo que tengo que descargar JHC. ¿Qué tengo que escribir en el archivo inf y cómo usarlo?
Tenga en cuenta que antes de responder a esta pregunta, no he usado jhc desde hace bastante tiempo desde que escribí esto originalmente y desde entonces se han lanzado versiones más nuevas, por lo que no sé qué tan estable es actualmente jhc cuando se trata de la generación de código de programas Haskell más complejos. Esta es una advertencia para cualquier persona antes de considerar hacer un gran programa Haskell con JHC, debe hacer algunas pruebas pequeñas antes de continuar.
jhc tiene un manual http://repetae.net/computer/jhc/manual.html y una sección sobre configuración de compilación cruzada y archivo .ini con opciones: http://repetae.net/computer/jhc/manual .html # compilación cruzada .
L01man: La segunda parte es una alternativa a la primera. No sé cómo hacer lo que dijiste en el tercero.
Antes de comenzar, debe tener algún conocimiento de C y sentirse cómodo con el uso de la interfaz de funciones externas (FFI) de Haskell y herramientas como hs2c. También debe estar familiarizado con el uso del NDK de Android y la creación de .apk con bibliotecas compartidas. Necesitará conocerlos para interactuar entre C-Haskell, Java / C-Haskell y desarrollar programas de Haskell para Android que pueda distribuir / vender oficialmente en la tienda del mercado.
L01man: Entiendo que su objetivo es crear un enlace para la API de Android. Pero ... ¿la cuarta parte dice que no podemos hacer .apk con Haskell?
.apk es solo un formato de archivo de paquete de aplicación y está construido con las herramientas que vienen con el SDK de Android (no NDK), esto tiene muy poco que ver con la creación de los propios binarios. Los paquetes de Android pueden contener bibliotecas compartidas nativas, esto es lo que será su programa Haskell y las bibliotecas nativas compartidas / estáticas se generan a través del NDK de Android.