前言:这是在/r/haskell上开始的线程的扩展
让我们从事实开始:
-
Android是一款非常棒的操作系统
-
Haskell是地球上最好的编程语言
因此,显然,将它们结合起来可以使Android开发更好 . 所以基本上我只想知道如何为Android OS编写Haskell程序 . 我的问题是:
如何在Android OS上执行/运行Haskell程序?
前言:这是在/r/haskell上开始的线程的扩展
让我们从事实开始:
Android是一款非常棒的操作系统
Haskell是地球上最好的编程语言
因此,显然,将它们结合起来可以使Android开发更好 . 所以基本上我只想知道如何为Android OS编写Haskell程序 . 我的问题是:
如何在Android OS上执行/运行Haskell程序?
6 回答
你是如何做到这一点的首先得到一个Haskell编译器,该编译器可以使用android NDK来定位C,后者附带了ARM架构的GCC端口 . JHC可以通过一个非常小的inf样式文件来执行此操作,该文件描述了我使用Wii自制开发工具包完成此操作的平台(字大小,c编译器等)并且非常简单 . 然而,jhc仍然存在一些复杂代码的稳定性问题,例如使用带有IO的monad变换器堆栈,但jhc在过去的6个月中已经有了很大的改进 . 只有一个人在JHC工作我只是希望有更多的人可以帮助他 .
另一种选择是 Build 一个针对ndk gcc的GHC“未注册”端口,这是一个涉及更多的过程,因为GHC目前不是真正的交叉编译器,你需要了解构建系统你需要哪些部分更改 . 另一种选择是NHC可以交叉编译为C,就像GHC你需要构建针对C编译器的nhc,NHC没有像GHC那样的许多Haskell扩展 .
一旦你有Haskell编译器定位NDK GCC,你将需要编写绑定到android NDK JNI胶水代码框架(自android 2.3添加)或者你必须在Java-C-Haskell之间编写JNI粘合代码,前者选项更容易解决方案,如果我没记错的话可能实际上与2.3以下的Android早期版本兼容 .
一旦你有了这个,你必须将Haskell代码构建为共享库或静态库,它们被链接到NDK java glue代码(它本身就是一个共享库) . 据我所知,你无法在android上正式运行本机可执行文件 . 您可以使用root电话执行此操作,因此我认为这意味着即使NDK gcc端口可以生成本机可执行文件,也无法在应用商店中分发本机可执行文件 . 这也可能会杀死使用LLVM的选项,除非您可以使NDK JNI与LLVM一起使用 .
最大的障碍不是为Android获取Haskell编译器(这仍然是一个很大的障碍),最大的问题是有些人需要为NDK库编写绑定API,这是一项艰巨的任务,如果你的情况更糟需要编写android UI代码,因为这部分android SDK没有NDK API . 如果你想在Haskell中做android UI代码,有人必须通过JNI / C编写Haskell绑定到Java . 除非有一个更自动化的过程来编写绑定库(我知道有一些,它们对我来说不够自动化),否则某人做这件事的可能性很低 .
请注意,在我回答这个问题之前,我已经很久没有使用过jhc了,因为我最初编写这个版本并且已经发布了更新的版本,所以我不知道jhc目前在更复杂的Haskell程序的代码生成方面有多稳定 . 在您考虑使用JHC制作大型Haskell程序之前,这是对任何人的警告,您应该在完成之前进行一些小测试 .
jhc有一个手册http://repetae.net/computer/jhc/manual.html和一个关于设置交叉编译和.ini文件的部分,其中包含选项:http://repetae.net/computer/jhc/manual.html#crosscompilation .
在开始之前,您应该具备一些C知识,并且熟悉使用Haskell外部函数接口(FFI)和hs2c等工具 . 您还应该熟悉使用Android NDK并使用共享库构建.apk . 您需要了解这些,以便在C-Haskell,Java / C-Haskell之间进行接口,并开发适用于Android的Haskell程序,您可以在市场商店正式分发/销售 .
.apk只是一个应用程序包文件格式,使用Android SDK(而不是NDK)附带的工具构建,这几乎没有什么可以构建二进制文件本身 . Android软件包可以包含本机共享库,这就是您的Haskell程序,以及通过Android NDK生成本机共享/静态库 .
有https://github.com/neurocyte/android-haskell-activity正在运行
Haskell
代码 .我曾经遇到过相同的Reddit线程,但它已经过时了,评论已经关闭 . 我向OP发了一条消息,但我不确定是否到达收件人 . 我的建议(可能适用于无法进行原生活动的老式机器人) .
我(前一段时间在Haskell开发,但目前已切换到Smalltalk)我正在开发一个Squeak VM到Android的端口 . 我这样做的方式与haskell-on-android项目中可能处理的方式类似:需要从应用程序的Java部分调用的一块C代码(基本上所有可以在Android中完成的都是处理各种事件;应用程序不能轮询事件本身,也没有任何事件循环) . 在我的例子中,代码是由Squeak VM构建工具生成的,在android上的haskell的情况下,这将从JHC的GHC或任何前端使用输出 . 这个回购可能值得一看:
http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/project
在"src"下面有Java代码,它提供用户事件拦截并将它们发送到本机代码(请参阅CogView类) . VM本身的C代码并不完全存在(请参阅squeakvm.org,Cog分支),但有人可能会得到这个想法 . 也可以查看http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm,这是解释器的C前端(包括用户事件处理,一些计时等)
希望这可以帮助 .
梅德
最近引起我注意的一种语言是Eta .
Eta的编译器是GHC 7.10的一个分支,它有一个JVM后端 . 可以使用生成的JAR文件编写Android应用程序,甚至可以使用其外部函数接口来调用本机Android Java库 .
Brian McKenna撰写了一篇关于how to configure an Android Studio project to use an Eta library的博客文章 .
https://github.com/conscell/hugs-android是Android的HUGS Haskell解释器的端口 .
我认为一般的答案应该来自source-> source转换,因为加载特殊编译的共享对象似乎有点像kludge(在上面的答案中涉及ghc-> c和c-> java步骤) . 因此,这个问题属于JVM上Haskell的 Headers ,它已经tried(作为Java中间表示的一步)和discussed的长度 . 如果您需要在那里编译库,可以使用frege . 剩下的唯一步骤是将Android框架API转换为IO()动作的开始,也许是构建清单xml和apk的包装器 .