Як це зробити, спочатку отримайте компілятор Haskell, який може націлити C на андроїд NDK, який поставляється з портом GCC для архітектур ARM. JHC може тривіально зробити це за допомогою дуже маленького файлу інф-стилю, який описує платформу (розмір слова, с-компілятор тощо). Я зробив це за допомогою набору для розробників Wii homebrew, і це було досить просто. Однак jhc все ще має деякі проблеми зі стабільністю зі складним кодом, таким як використання стека трансформаторів монад з IO, але jhc значно покращується за останні 6 місяців. Є лише одна людина, яка працює над JHC, я просто хотів, щоб більше людей могли допомогти йому.
Інший варіант - створити "незареєстрований" порт GHC, орієнтований на ndk gcc, це набагато більше залучений процес, оскільки GHC на даний момент не є справжнім крос-компілятором, і вам потрібно зрозуміти системі складання, які частини вам потрібно змінити. Інший варіант - NHC, який може перетинати компіляцію на C, як GHC, вам потрібно створити nhc, орієнтований на компілятор C, NHC не має багатьох розширень Haskell, таких як GHC.
Коли у вас є компілятор Haskell, орієнтований на NDK GCC, вам потрібно буде записати прив’язки до андроїд-рамки коду клею NDK JNI (додано з Android 2.3) або вам потрібно написати код клею JNI між Java-C-Haskell, колишній варіант простіше рішення, і якщо я правильно пам'ятаю, це може бути фактично сумісною з попередніми версіями Android нижче 2.3.
Після цього ви повинні створити код Haskell як спільну бібліотеку або статичну бібліотеку, яка з’єднується з кодом клею NDK java (який сам по собі є спільною бібліотекою). Наскільки я знаю, ви не можете офіційно запускати нативні виконавчі файли на android. Ви, ймовірно, могли б зробити це з укоріненим телефоном, тому я припускаю, що це означає, що ви не можете поширювати нативні виконавчі файли в магазині додатків, навіть коли порт GDC NDK може просто генерувати вбудовані файли. Це також, ймовірно, вбиває можливість використання LLVM, якщо ви не зможете отримати NDK JNI, що працює з LLVM.
Найбільша перешкода - це не стільки отримання компілятора Haskell для android (що все ще є великою перешкодою). Найбільша проблема полягає в тому, що комусь потрібно написати прив'язуючі API для бібліотек NDK, що є величезним завданням, і ситуація гірша, якщо ти потрібно написати код UI для android, оскільки для цієї частини SDK для android немає API NDK. Якщо ви хочете зробити Android-код UI в 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. Але ... чи говорить четверта частина, що ми не можемо зробити .apk з Haskell?
.apk - це лише формат файлу пакету додатків і побудований за допомогою інструментів, що постачаються разом із SDK для Android (не NDK). Це дуже мало для створення самих бінарних файлів. Пакети Android можуть містити вбудовані бібліотеки спільного користування. Це буде ваша програма Haskell, а вбудовані / статичні бібліотеки створюються через Android NDK.