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