Bunu nasıl yapacağınız ilk önce ARM mimarileri için bir GCC portu ile birlikte gelen android NDK ile C'yi hedefleyebilen bir Haskell derleyicisi alarak. JHC bunu Wii homebrew dev kit ile yaptığım platformu (kelime boyutu, c-derleyici, vb) açıklayan çok küçük bir inf tarzı dosya ile yapabilirsiniz ve oldukça kolay oldu. Ancak jhc hala IO ile bir monad transformatör yığını kullanmak gibi karmaşık kod ile ilgili bazı istikrar sorunları var ama jhc son 6 ay içinde çok gelişiyor. JHC üzerinde çalışan sadece bir kişi var, ona daha fazla insanın yardım etmesini diledim.
Diğer seçenek, ndk gcc'yi hedefleyen bir "kayıtsız" GHC portu oluşturmaktır, bu çok daha karmaşık bir süreçtir, çünkü GHC şu anda gerçek bir çapraz derleyici değildir ve yapı sistemine hangi parçalara ihtiyacınız olduğunu anlamanız gerekir değişiklik. Başka bir seçenek, C'ye çapraz derlenebilen NHC'dir, GHC gibi bir C derleyicisini hedefleyen nhc oluşturmanız gerekir, NHC'nin GHC gibi birçok Haskell uzantısı yoktur.
NDK GCC'yi hedefleyen Haskell derleyicisine sahip olduğunuzda, android NDK JNI tutkal kodu çerçevesine (android 2.3'ten beri eklenmiştir) bağlamalar yazmanız veya Java-C-Haskell arasında JNI tutkal kodunu yazmanız gerekir, eski seçenek daha kolaydır ve doğru hatırlamıyorsam, Android 2.3'ün altındaki önceki sürümleriyle geriye dönük olarak uyumlu olabilir.
Bunu yaptıktan sonra, Haskell kodunu paylaşılan kütüphane veya NDK java tutkal koduna (kendisi paylaşılan bir kütüphane olan) bağlanan statik kütüphane olarak oluşturmanız gerekir. Bildiğim kadarıyla resmen android yerel yürütülebilir çalıştırmak olamaz. Muhtemelen köklü bir telefonla yapabilirsin, bu yüzden bu NDK gcc portu yerel yürütülebilir dosyaları gayet iyi üretebilse bile uygulama mağazasında yerel yürütülebilir dosyaları dağıtamayacağınız anlamına gelir. NDK JNI'nin LLVM ile çalışmasını sağlayamazsanız, bu muhtemelen LLVM kullanma seçeneğini de öldürür.
En büyük engel android için bir Haskell derleyici (bu hala büyük bir engel) almak o kadar büyük değil. android SDK'nın bu kısmı için NDK API'si olmadığından android UI kodu yazmanız gerekir. Eğer Haskell android UI kodu yapmak istiyorsanız, birileri JNI / C aracılığıyla Java Haskell bağları yazmak zorunda kalacak. Bağlama kütüphaneleri yazmak için daha otomatik bir süreç olmadığı sürece (bazıları olduğunu biliyorum, onlar benim için yeterince otomatik değiller) o zaman bunu yapma şansı oldukça düşüktür.
L01man: Bunun nasıl yapılacağı hakkında bir eğitim var mı? İlk kısımda, JHC'yi indirmem gerektiğini anlıyorum. Inf dosyasına ne yazmam gerekiyor ve nasıl kullanılır?
Bu soruya cevap vermeden önce, jhc'yi bir süredir kullanmadığımı lütfen unutmayın, çünkü başlangıçta bunu yazdım ve daha yeni sürümler piyasaya sürüldü, bu yüzden daha karmaşık Haskell programlarının kod üretimi söz konusu olduğunda jhc'nin ne kadar kararlı olduğunu bilmiyorum. Bu, JHC ile büyük bir Haskell programı yapmayı düşünmeden önce herkes için bir uyarıdır, devam etmeden önce bazı küçük testler yapmalısınız.
jhc'de manuel http://repetae.net/computer/jhc/manual.html ve çapraz derleme ve .ini dosyası kurma seçenekleriyle ilgili bir bölüm vardır: http://repetae.net/computer/jhc/manual .html # çapraz derleme .
L01man: İkinci kısım birinciye alternatif. Üçüncüsü söylediklerini nasıl yapacağımı bilmiyorum.
Başlamadan önce C hakkında bilgi sahibi olmanız ve Haskell yabancı işlev arabirimini (FFI) ve hs2c gibi araçları kullanmanız konusunda rahat olmanız gerekir. Android NDK'yı kullanma ve paylaşılan kütüphanelerle .apk oluşturma konusunda da bilgi sahibi olmalısınız. C-Haskell, Java / C-Haskell arasında arayüz oluşturmak ve pazar için resmi olarak dağıtabileceğiniz / satabileceğiniz Android için Haskell programları geliştirmek için bunları bilmeniz gerekecek.
L01man: Amacının Android API için bir bağlayıcı oluşturmak olduğunu anlıyorum. Ama ... 4. bölüm Haskell ile .apk yapamayacağımızı söylüyor mu?
.apk sadece bir uygulama paketi dosya biçimidir ve Android SDK (NDK değil) ile birlikte gelen araçlarla oluşturulmuştur, bu ikili dosyaların kendisini oluşturmak için çok az şey vardır. Android paketleri yerel paylaşılan kütüphaneler içerebilir, Haskell programınız bu olacak ve yerel paylaşılan / statik kütüphaneler Android NDK aracılığıyla oluşturulur.