Como você faz isso, primeiro obtendo um compilador Haskell que pode direcionar C com o NDK do Android, que vem com uma porta GCC para arquiteturas ARM. O JHC pode fazer isso trivialmente com um arquivo de estilo inf muito pequeno, que descreve a plataforma (tamanho da palavra, compilador c, etc). Fiz isso com o kit de desenvolvimento do Wii homebrew e foi bastante fácil. No entanto, o jhc ainda tem alguns problemas de estabilidade com códigos complexos, como o uso de uma pilha de transformadores de mônada com E / S, mas o jhc vem melhorando bastante nos últimos 6 meses. Há apenas uma pessoa trabalhando no JHC, que eu gostaria que mais pessoas pudessem ajudá-lo.
A outra opção é criar uma porta "não registrada" do GHC visando o ndk gcc, esse é um processo muito mais complicado, porque o GHC não é um verdadeiro cross-compilador no momento e você precisa entender o sistema de construção com quais partes você precisa. mudança. Outra opção é o NHC, que pode ser compilado de forma cruzada em C, como o GHC, você precisa criar o nhc direcionado a um compilador C; o NHC não possui muitas extensões Haskell como o GHC.
Depois de ter o compilador Haskell direcionado ao NDK GCC, você precisará escrever ligações na estrutura de código de cola NDN JNI do Android (adicionada desde o Android 2.3) ou escrever o código de cola JNI entre Java-C-Haskell, a primeira opção é a mais fácil solução e se bem me lembro pode realmente ser compatível com versões anteriores do Android abaixo de 2,3.
Depois de ter isso, você deve criar o código Haskell como biblioteca compartilhada ou biblioteca estática que é vinculada ao código de cola Java NDK (que é uma biblioteca compartilhada). Tanto quanto sei, você não pode executar oficialmente executáveis nativos no Android. Você provavelmente poderia fazê-lo com um telefone root, portanto, presumo que isso significa que você não pode distribuir executáveis nativos na loja de aplicativos, mesmo quando a porta NDK gcc pode gerar executáveis nativos sem problemas. Isso provavelmente também mata a opção de usar o LLVM, a menos que você possa fazer com que o NDK JNI trabalhe com o LLVM.
O maior obstáculo não é tanto obter um compilador Haskell para Android (o que ainda é um grande obstáculo), o maior problema é que alguém precisa escrever APIs de ligação para bibliotecas NDK, o que é uma tarefa enorme e a situação é pior se você é necessário escrever o código da interface do usuário do Android porque não há APIs NDK para esta parte do SDK do Android. Se você deseja criar o código da interface do usuário do Android no Haskell, alguém terá que escrever as ligações do Haskell no Java por meio do JNI / C. A menos que exista um processo mais automatizado para escrever bibliotecas de ligação (eu sei que existem algumas, elas simplesmente não são automatizadas o suficiente para mim), as chances de alguém fazer isso são bastante baixas.
L01man: Existe um tutorial sobre como fazer isso? Para a primeira parte, entendo que tenho que baixar o JHC. O que tenho para escrever no arquivo inf e como usá-lo?
Observe que, antes de responder a essa pergunta, não uso o jhc há algum tempo desde que escrevi isso originalmente e versões mais recentes foram lançadas desde então, não sei o quão estável o jhc atualmente é quando se trata de geração de código de programas Haskell mais complexos. Este é um aviso para qualquer pessoa antes de considerar fazer um programa Haskell grande com o JHC, você deve fazer alguns pequenos testes antes de continuar.
O jhc possui um manual http://repetae.net/computer/jhc/manual.html e uma seção sobre configuração de compilação cruzada e arquivo .ini com opções: http://repetae.net/computer/jhc/manual .html # compilação cruzada .
L01man: A segunda parte é uma alternativa à primeira. Não sei como fazer o que você disse no terceiro.
Antes de começar, você deve ter algum conhecimento de C e se familiarizar com o uso da interface de função externa Haskell (FFI) e ferramentas como hs2c. Você também deve estar familiarizado com o uso do Android NDK e a criação de .apk com bibliotecas compartilhadas. Você precisará conhecê-los para fazer a interface entre C-Haskell, Java / C-Haskell e desenvolver programas Haskell para Android que você pode distribuir / vender oficialmente na loja do mercado.
L01man: Entendo que seu objetivo é criar uma ligação para a API do Android. Mas ... a quarta parte diz que não podemos fazer .apk com Haskell?
O .apk é apenas um formato de arquivo de pacote de aplicativo e é construído com as ferramentas que acompanham o Android SDK (não o NDK); isso tem muito pouco a ver com a criação dos próprios binários. Os pacotes do Android podem conter bibliotecas compartilhadas nativas; é esse o seu programa Haskell e as bibliotecas compartilhadas / estáticas nativas são geradas pelo NDK do Android.
Existe https://github.com/neurocyte/android-haskell-activity demonstrando a
Haskell
execução do código.fonte
Uma linguagem que recentemente chamou minha atenção é a Eta .
O compilador do Eta é um fork do GHC 7.10 que possui um back-end da JVM. É possível usar os arquivos JAR gerados para gravar aplicativos Android e até mesmo usar sua Interface de Função Estrangeira para chamar bibliotecas Java nativas do Android.
Brian McKenna escreveu uma postagem no blog sobre como configurar um projeto do Android Studio para usar uma biblioteca Eta .
fonte
Uma vez me deparei com o mesmo segmento do Reddit, mas ele era antigo e os comentários foram fechados. Enviei uma mensagem para o OP, mas não tenho certeza se chegou ao destinatário. Minha sugestão aqui (pode funcionar para Androids mais antigos, onde atividades nativas não eram possíveis).
Eu (desenvolvido em Haskell há algum tempo, mas atualmente mudei para Smalltalk) atualmente estou desenvolvendo uma porta do Squeak VM para o Android. A maneira como estou fazendo isso é semelhante ao que pode ser tratado em um projeto haskell-on-android: um pedaço de código C que precisa ser chamado da parte Java do aplicativo (basicamente tudo o que pode ser feito no Android é manipular vários eventos; um aplicativo não pode pesquisar eventos em si e não possui nenhum loop de eventos). No meu caso, o código é gerado pelas ferramentas de construção da Squeak VM, no caso de haskell no Android, isso será gerado pelo GHC do JHC ou por qualquer front end usado. Vale a pena examinar este repo:
http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/project
Em "src", há o código Java que fornece a interceptação de eventos do usuário e os envia para o código nativo (consulte a classe CogView). O código C da própria VM não está completamente lá (consulte squeakvm.org, o ramo Cog para isso), mas pode-se ter uma idéia. Pode-se também procurar em http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm, que é o frontend C do intérprete (incluindo manipulação de eventos do usuário, algumas cronometragens, etc.). )
Espero que isto ajude.
Dmitry
fonte
Existe https://github.com/conscell/hugs-android uma porta do intérprete HUGS Haskell para o Android.
fonte
Eu acho que a resposta geral deve vir das transformações fonte-> fonte, uma vez que carregar objetos compartilhados especialmente compilados parece um pouco problemático (envolvendo ghc-> ce c-> java nas respostas acima). Essa questão, portanto, se enquadra no cabeçalho de Haskell na JVM, que foi tentada (com uma etapa como uma representação intermediária Java) e discutida detalhadamente. Você pode usar o frege se as bibliotecas necessárias forem compiladas lá. As únicas etapas restantes seriam o início da API da estrutura do Android traduzida em ações de IO () e talvez um wrapper para criar o manifesto xml e apk.
fonte