Rob*_*oli 210 executable android haskell
前言:这是在/ r/haskell上启动的线程的扩展
让我们从事实开始:
因此,很明显,将它们结合起来可以使Android开发更好.所以基本上我只想知道如何为Android OS编写Haskell程序.我的问题是:
如何在Android OS上执行/运行Haskell程序?
snk*_*kid 80
你是如何做到这一点的首先是得到一个Haskell编译器,它可以用android NDK来定位C,它带有一个用于ARM架构的GCC端口.JHC可以通过一个非常小的inf样式文件来执行此操作,该文件描述了我使用Wii自制开发工具包完成此操作的平台(字大小,c编译器等)并且非常简单.然而,jhc仍然存在复杂代码的一些稳定性问题,例如使用带有IO的monad变换器堆栈,但jhc在过去6个月中已经有了很大的改进.只有一个人在JHC工作我只是希望有更多的人可以帮助他.
另一种选择是建立一个针对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粘合代码(它本身就是一个共享库).据我所知,你无法在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.除非有一个更自动化的过程来编写绑定库(我知道有一些,它们对我来说不够自动化),否则某些人做这件事的机会很低.
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生成本机共享/静态库.
gli*_*tak 16
有https://github.com/neurocyte/android-haskell-activity演示Haskell代码运行.
Rob*_*oli 14
最近引起我注意的一种语言是Eta.
Eta的编译器是GHC 7.10的一个分支,它有一个JVM后端.可以使用生成的JAR文件编写Android应用程序,甚至可以使用其外部函数接口来调用本机Android Java库.
Brian McKenna撰写了一篇关于如何配置Android Studio项目以使用Eta库的博客文章.

小智 9
我曾经遇到过相同的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前端(包括用户事件处理,一些计时等). )
希望这可以帮助.
梅德
| 归档时间: |
|
| 查看次数: |
30364 次 |
| 最近记录: |