在Android OS上运行一个Haskell程序
前注:这是在/ r / haskell上启动的线程的扩展
让我们从事实开始:
因此,显然,将它们结合起来会让Android的开发变得更好。 所以基本上我只想知道如何编写Android操作系统的Haskell程序。 我的问题是:
我怎样才能让Haskell程序在Android OS上执行/运行?
你如何做到这一点首先得到一个Haskell编译器,它可以将Android的NDK与ARM体系结构的GCC端口一起使用。 JHC可以用一个非常小的inf样式文件来描述平台(字的大小,C编译器等),我已经用Wii自制开发工具包完成了这个工作,这很容易。 然而,jhc对于复杂的代码仍然存在一些稳定性问题,比如在IO中使用monad变压器堆栈,但jhc在过去6个月中一直在改进。 只有一个人在JHC工作,我只是希望更多的人能够帮助他。
另一种选择是构建一个针对ndk gcc的GHC的“未注册”端口,这是一个更多涉及的过程,因为GHC此刻不是真正的交叉编译器,您需要了解构建系统需要哪些部分更改。 另一种选择是可以交叉编译为C的NHC,就像你需要构建针对C编译器的ncc一样,NHC没有许多像GHC一样的Haskell扩展。
一旦你有了针对NDK GCC的Haskell编译器,你需要编写绑定到android NDK JNI胶合代码框架(自android 2.3以后添加),或者你必须在Java-C-Haskell之间编写JNI胶合代码,前者更容易解决方案,如果我没有记错的话,实际上可能会向后兼容低于2.3的Android版本。
一旦你有了这个,你必须建立Haskell代码作为共享库或静态库,它被链接到NDK java glue代码(它本身就是一个共享库)。 据我所知,你不能在android上正式运行本机可执行文件。 你可以用一个根植的手机来做,因此我认为这意味着即使NDK gcc端口可以生成本机可执行文件,你也不能在应用程序商店分发本地可执行文件。 这也可能会杀死使用LLVM的选项,除非您可以获得NDK JNI与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创建一个绑定。 但是......第四部分是否说我们不能用Haskell制作.apk?
.apk只是一个应用程序包文件格式,并且是使用Android SDK(不是NDK)附带的工具构建的,因此它本身不构建二进制文件。 Android软件包可以包含本地共享库,这是你的Haskell程序将会和通过Android NDK生成本地共享/静态库。
有https://github.com/neurocyte/android-haskell-activity演示Haskell
代码正在运行。
我曾经遇到过相同的Reddit线程,但它已经很老了,并且评论被关闭了。 我向OP发送了一条消息,但我不确定它是否到达收件人。 我的建议(可能适用于无法使用本地活动的旧版Android)。
我(前段时间在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类)。 虚拟机本身的C代码并不完全存在(请参阅squeakvm.org,Cog分支),但有人可能会明白。 其中一个也可能是http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm,它是解释器的C前端(包括用户事件处理,计时等)。 )
希望这可以帮助。
梅德
链接地址: http://www.djcxy.com/p/51749.html