Как это сделать - сначала получить компилятор 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.