在Android操作系统上运行Haskell程序


216

前言:这是在/ r / haskell上启动的线程的扩展

让我们从事实开始:

  • Android是一个很棒的操作系统
  • Haskell是地球上最好的编程语言

因此,显然,将它们组合在一起将使Android开发更好。因此,从本质上讲,我只想知道如何为Android OS编写Haskell程序。我的问题是:

如何获得Haskell程序以在Android OS上执行/运行?

Answers:


81

如何做到这一点,首先要获得一个Haskell编译器,该编译器可以使用android NDK来针对C,后者带有用于ARM体系结构的GCC端口。JHC可以使用一个非常小的inf样式文件来简单地完成此操作,该文件描述了平台(字大小,C编译器等)。但是,jhc在复杂代码方面仍然存在一些稳定性问题,例如使用带IO的monad变压器堆栈,但在过去6个月中jhc一直在进步很多。我只希望JHC上有一个人,我只是希望更多的人可以帮助他。

另一个选择是针对ndk gcc构建GHC的“未注册”端口,这是一个涉及更多的过程,因为GHC目前还不是真正的交叉编译器,您需要了解构建系统需要的部分。更改。另一个选择是NHC,它可以交叉编译为C,就像GHC一样,您需要针对C编译器构建nhc,而NHC没有像GHC这样的许多Haskell扩展。

具有针对NDK GCC的Haskell编译器后,您将需要向android NDK JNI胶水代码框架(自android 2.3开始添加)编写绑定,或者必须在Java-C-Haskell之间编写JNI胶水代码,前一种选择更容易解决方案,如果我没记错的话,实际上可能与2.3以下的早期版本的Android向后兼容。

一旦有了这个,就必须将Haskell代码构建为共享库或静态库,并将其链接到NDK Java胶合代码(它本身是共享库)中。据我所知,您不能在android上正式运行本机可执行文件。您可能可以使用有根电话进行操作,因此我认为这意味着即使NDK gcc端口可以生成本机可执行文件,您也无法在应用商店上分发本机可执行文件。除非您可以使NDK JNI与LLVM一起使用,否则这也可能会取消使用LLVM的选项。

最大的障碍不是要为Android获取Haskell编译器(这仍然是一个大障碍),而最大的问题是有人需要为NDK库编写绑定API,这是一项艰巨的任务,如果您这样做,情况会更糟。需要编写android UI代码,因为android SDK的这一部分没有NDK API。如果要在Haskell中执行android UI代码,则必须通过JNI / C将Haskell绑定写入Java。除非有一个更加自动化的过程来编写绑定库(我知道有一些库,对我而言它们还不够自动化),否则有人进行绑定库的机会就很低。

L01man:是否有有关如何执行此操作的教程?对于第一部分,我了解我必须下载JHC。我必须在inf文件中写些什么以及如何使用它?

请注意,在回答这个问题之前,我已经有一段时间没有使用jhc了,自从我写了这个以后,已经发布了较新的版本,因此我不知道jhc在生成更复杂的Haskell程序的代码方面目前有多稳定。这是对任何人的警告,在您考虑使用JHC编写大型Haskell程序之前,应先进行一些小测试,然后再继续进行。

jhc确实有手册http://repetae.net/computer/jhc/manual.html以及关于设置交叉编译和.ini文件的部分,其中包含以下选项:http : //repetae.net/computer/jhc/manual .html#crosscompilation

L01man:第二部分是第一部分的替代。我不知道该怎么做。

在开始之前,您应该了解C并熟悉使用Haskell外部功能接口(FFI)和诸如hs2c之类的工具。您还应该熟悉使用Android NDK以及使用共享库构建.apk的过程。您将需要了解这些内容,才能在C-Haskell,Java / C-Haskell之间建立接口并开发适用于Android的Haskell程序,您可以在市场商店上正式分发/销售这些程序。

L01man:我了解它的目标是为Android API创建绑定。但是...第4部分是否说我们不能用Haskell制作.apk?

.apk只是一种应用程序包文件格式,是使用Android SDK(不是NDK)随附的工具构建的,与构建二进制文件本身几乎没有关系。Android软件包可以包含本机共享库,这就是您的Haskell程序所要使用的库,本机共享/静态库是通过Android NDK生成的。


我绝不是Android专家。但是今天,我遇到了自API级别9 developer.android.com/reference/android/app/NativeActivity.html以来的新类NativeACtivity 。他们说,它可以完全用于以本机代码实现活动。我想知道这对我们的目的有多重要/有用吗?这是否意味着Haskell和Java之间不需要交互?
菲尔(Phil)

@Po NativeActivity是我一直在写的android NDK胶水代码框架(android 2.3)的一部分。它将允许您用C / C ++编写所有代码,但是您将没有本机可执行文件,您将有一个共享库,可从Java中调用它。如果您将Haskell绑定编写为NativeActivity,则无需在Java和Haskell之间编写绑定,但是正如我已经提到的那样,NDK API是完整Java API的子集,例如,对于标准的android UI,没有本地API。在OpenGL(ES)中编写自己的文件或编写JNI-Haskell绑定。
snk_kid 2011年

是否有有关如何执行此操作的教程?
L01man 2012年

对于第一部分,我了解我必须下载JHC。我必须在inf文件中写些什么以及如何使用它?第二部分是第一部分的替代。我不知道该怎么做。我了解其目标是为Android API创建绑定。但是...第4部分是否说我们不能用Haskell制作.apk?
L01man 2012年

@ L01man由于评论中的字符数限制,我已经在主要答案中回答了您的问题。
snk_kid

16

4
一个...的儿子实际上是这样做的!荣誉
罗伯特·马赛利

我将很快对此进行仔细研究。如果看起来合法,那么我将更改对此答案的标记答案。
罗伯特·马赛利

罗伯特,看来确实合法。但是Neurocyte似乎并未提供有关构建的详细说明。阅读github.com/neurocyte/android-haskell-activity/issues/1
gliptak 2013年


9

我曾经遇到过相同的Reddit线程,但是它很旧,并且评论已关闭。我向OP发送了一条消息,但不确定是否到达收件人。我在这里的建议(可能适用于无法进行本地活动的旧版Android)。

我(前一段时间在Haskell开发,但目前切换到Smalltalk)目前正在开发将Squeak VM移植到Android的端口。我执行此操作的方式类似于在Android上haskell上的项目中可能处理的方式:大量的C代码需要从应用程序的Java部分调用(基本上,在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前端(包括用户事件处理,一些计时等)。 )

希望这可以帮助。

德米特里



6

我认为一般的答案应该来自source-> source转换,因为加载专门编译的共享对象似乎有点麻烦(在上面的答案中涉及ghc-> c和c-> java步骤)。因此,这个问题落在JVM上的Haskell的标题下,该问题已经尝试过(以一步作为Java中间表示形式)并进行了详细讨论。如果需要在此处编译的库,则可以使用frege。剩下的唯一步骤是将Android框架API的开头翻译为IO()操作,并且可能是用于构建清单xml和apk的包装器。


1
实际上,这里有一个用Java和Frege编写的Android展示应用程序,详细信息在这里groups.google.com/forum/#!topic/frege-programming-language/…–
Ingo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.