前言:这是在/ r / haskell上启动的线程的扩展
让我们从事实开始:
- Android是一个很棒的操作系统
- Haskell是地球上最好的编程语言
因此,显然,将它们组合在一起将使Android开发更好。因此,从本质上讲,我只想知道如何为Android OS编写Haskell程序。我的问题是:
如何获得Haskell程序以在Android OS上执行/运行?
前言:这是在/ r / haskell上启动的线程的扩展
让我们从事实开始:
因此,显然,将它们组合在一起将使Android开发更好。因此,从本质上讲,我只想知道如何为Android OS编写Haskell程序。我的问题是:
如何获得Haskell程序以在Android OS上执行/运行?
Answers:
如何做到这一点,首先要获得一个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生成的。
有https://github.com/neurocyte/android-haskell-activity演示Haskell
代码运行。
Eta是最近引起我注意的一种语言。
Eta的编译器是GHC 7.10的一个分支,它具有JVM后端。可以使用生成的JAR文件编写Android应用,甚至可以使用其外部功能接口来调用本地Android Java库。
Brian McKenna写了一篇博客文章,介绍如何配置Android Studio项目以使用Eta库。
我曾经遇到过相同的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前端(包括用户事件处理,一些计时等)。 )
希望这可以帮助。
德米特里
HUGS Haskell解释器到Android的端口为https://github.com/conscell/hugs-android。
我认为一般的答案应该来自source-> source转换,因为加载专门编译的共享对象似乎有点麻烦(在上面的答案中涉及ghc-> c和c-> java步骤)。因此,这个问题落在JVM上的Haskell的标题下,该问题已经尝试过(以一步作为Java中间表示形式)并进行了详细讨论。如果需要在此处编译的库,则可以使用frege。剩下的唯一步骤是将Android框架API的开头翻译为IO()操作,并且可能是用于构建清单xml和apk的包装器。