Как это сделать - сначала получить компилятор Haskell, который может нацеливать C на android NDK, который поставляется с портом GCC для архитектур ARM. JHC может тривиально сделать это с помощью очень маленького файла в стиле inf, который описывает платформу (размер слова, c-компилятор и т. Д.). Я сделал это с помощью набора для домашнего разработчика Wii, и это было довольно легко. Однако у jhc все еще есть некоторые проблемы со стабильностью сложного кода, такие как использование стека монадных преобразователей с IO, но jhc значительно улучшился за последние 6 месяцев. Есть только один человек, работающий над JHC, я просто хотел, чтобы больше людей могло помочь ему.
Другой вариант - создать «незарегистрированный» порт GHC, ориентированный на ndk gcc. Это гораздо более сложный процесс, поскольку GHC на данный момент не является настоящим кросс-компилятором, и вам необходимо понять, какая система нужна для сборки. изменение. Другой вариант - NHC, который может кросс-компилироваться в C, например, GHC, вам нужно создать nhc для компилятора C, NHC не имеет многих расширений Haskell, таких как GHC.
После того как у вас есть компилятор Haskell, нацеленный на NDK GCC, вам нужно будет написать привязки либо для структуры связующего кода JNI android NDK (добавлена начиная с android 2.3), либо вы должны написать связующий код JNI между Java-C-Haskell, чем первый вариант проще Решение и, если я правильно помню, может быть обратно совместим с предыдущими версиями Android ниже 2.3.
Получив это, вы должны построить код на Haskell в виде разделяемой библиотеки или статической библиотеки, которая будет связана с Java-кодом NDK glue (которая сама является разделяемой библиотекой). Насколько я знаю, вы не можете официально запускать нативные исполняемые файлы на Android. Вероятно, вы могли бы сделать это с рутированным телефоном, поэтому я предполагаю, что это означает, что вы не можете распространять собственные исполняемые файлы в магазине приложений, даже если порт NDK gcc может генерировать собственные исполняемые файлы просто отлично. Это также, вероятно, убивает возможность использования LLVM, если только вы не можете заставить JNI NDK работать с LLVM.
Самым большим препятствием является не столько получение компилятора Haskell для Android (что все еще остается большим препятствием), но и самая большая проблема в том, что кому-то нужно написать API привязки для библиотек NDK, что является огромной задачей, и ситуация будет хуже, если вы необходимо написать код пользовательского интерфейса Android, потому что для этой части Android SDK нет API-интерфейсов NDK. Если вы хотите сделать код пользовательского интерфейса Android на Haskell, кто-то должен будет написать привязки Haskell к Java через JNI / C. Если нет более автоматизированного процесса написания библиотек связывания (я знаю, что есть некоторые, они просто недостаточно автоматизированы для меня), тогда шансы того, что кто-то сделает это, довольно низки.
L01man: Есть ли учебник о том, как это сделать? Для первой части я понимаю, что я должен загрузить JHC. Что я должен написать в файле inf и как его использовать?
Пожалуйста, обратите внимание, прежде чем я отвечу на этот вопрос, я не использовал jhc довольно долгое время, так как я изначально написал это, и с тех пор были выпущены новые версии, поэтому я не знаю, насколько стабильна jhc в настоящее время, когда дело доходит до генерации кода более сложных программ на Haskell. Это предупреждение для всех, прежде чем вы решите создать большую программу на Haskell с JHC, вам следует выполнить несколько небольших тестов, прежде чем приступить к работе.
У jhc есть руководство http://repetae.net/computer/jhc/manual.html и раздел о настройке кросс-компиляции и INI-файл с параметрами: http://repetae.net/computer/jhc/manual .html # кросс-компиляция .
L01man: Вторая часть является альтернативой первой. Я не знаю, как сделать то, что вы сказали в третьем.
Прежде чем начать, вы должны иметь некоторые знания о C и уметь пользоваться интерфейсом внешних функций Haskell (FFI) и такими инструментами, как hs2c. Вы также должны быть знакомы с использованием Android NDK и сборкой .apk с общими библиотеками. Вам нужно знать их для взаимодействия между C-Haskell, Java / C-Haskell и разработки программ на Haskell для Android, которые вы можете официально распространять / продавать в магазине.
L01man: Я понимаю, что его цель - создать привязку для Android API. Но ... в 4-й части говорится, что мы не можем сделать .apk с Haskell?
.apk - это просто формат файла пакета приложения, созданный с помощью инструментов, которые поставляются с Android SDK (не NDK), поэтому для сборки двоичных файлов очень мало что нужно. Пакеты Android могут содержать собственные разделяемые библиотеки, как и ваша программа на Haskell, а собственные разделяемые / статические библиотеки создаются с помощью Android NDK.
Язык, который недавно привлек мое внимание, это Eta .
Компилятор Eta - это форк GHC 7.10 с бэкэндом JVM. Сгенерированные файлы JAR можно использовать для написания приложений Android и даже использовать интерфейс внешних функций для вызова собственных библиотек Java Java Android.
Брайан МакКенна написал сообщение в блоге о том, как настроить проект Android Studio для использования библиотеки Eta .
источник
Существует https://github.com/neurocyte/android-haskell-activity, демонстрирующий выполнение
Haskell
кода.источник
Однажды я наткнулся на ту же ветку Reddit, но она была старой, и комментарии были закрыты. Я отправил сообщение в ОП, но не уверен, достигло ли оно получателя. Мое предложение здесь (может работать для старых Android, где родные действия были невозможны).
Я (разработал в Haskell некоторое время назад, но в настоящее время переключился на Smalltalk) в настоящее время разрабатываю порт Squeak VM для Android. То, как я это делаю, похоже на то, с чем можно столкнуться в проекте haskell-on-android: кусок кода на C, который нужно вызывать из Java-части приложения (в основном все, что можно сделать в Android, это обрабатывать различные события; приложение не может опросить сами события и не имеет никакого цикла обработки событий). В моем случае код генерируется инструментами сборки Squeak VM, в случае haskell на Android это будет выводиться из GHC JHC или любого другого используемого интерфейса. Это репо может стоить посмотреть на:
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-интерфейсом для интерпретатора (включая обработку пользовательских событий, некоторую хронометражу и т. Д.). )
Надеюсь это поможет.
Дмитрий
источник
Существует https://github.com/conscell/hugs-android порт интерпретатора HUGS Haskell для Android.
источник
Я думаю, что общий ответ должен исходить от преобразований source-> source, так как загрузка специально скомпилированных общих объектов кажется чем-то вроде пустяка (включая ghc-> c и шаг c-> java в ответах выше). Таким образом, этот вопрос подпадает под заголовок Haskell в JVM, который был опробован (с одним шагом в качестве промежуточного представления Java) и подробно обсужден . Вы можете использовать frege, если вам нужно скомпилировать библиотеки. Единственным оставшимся шагом будет начало API-интерфейса платформы Android, переведенное в действия IO (), и, возможно, оболочка для создания манифеста xml и apk.
источник