Статьи по теме: HDroidGUI h4aFirstApp Скачать: HDroidGUI 0.4 build 6: HDroidGUI на Github libharbour4a на Github |
Харбор и АндроидХотя говорить здесь мы будем о программировании на Харбор для Андроид, этот материал может быть интересен и для тех, кто пишет на других языках. Решения, которые здесь рассматриваются, носят универсальный характер и могут быть использованы и другими системами программирования, если они могут быть собраны из исходников в so - библиотеку под Линукс и имеют C API, ну и, конечно, могут использоваться C/C++ разработчиками.Цель этой статьи - изучение возможности писать программы для Андроид на привычном языке, в данном случае - на Харборе. Для начала немного о том, что же такое Андроид с точки зрения разработчика.Это операционная система от компании Google для мобильных устройств - смартфонов и планшетов. |
В основе системы - ядро Линукс, скомпилированное из исходников Линукс для мобильных устройств.
Следующий слой - виртуальная машина Java, названная Dalvik - она оптимизирована для мобильных устройств. Это интерпретатор байт-кодов, аналогичный по своей структуре другим подобным интерпретаторам, в т.ч. хорошо знакомой нам виртуальной машине Harbour.
На том же структурном уровне - системные библиотеки, в т.ч. стандартные С библиотеки, OpenGL ES для 2D и 3D графики, движок SQLite.
Далее - фреймворк приложений ( application framework ) - весьма богатый набор разнообразных API для разработчика.
И, наконец, сами пользовательские приложения, которые мы с вами пишем и которыми пользуемся.
Родной язык программирования для Андроид - Java, на нем пишется основная масса программ, именно этот код выполняется виртуальной машиной Dalvik. Но Java позволяет подключать модули, написанные на C и C++ - как и для Harbour, там имеется соответствующее API, оно носит название JNI - Java Native Interface. Модули на C в терминологии Java называются native - "родными" или, как это иногда буквально переводят, "нативными". В принципе, программу для Андроид можно и целиком написать на C, в этом случае компоненты графического интерфейса надо реализовывать самостоятельно - рисовать, что называется, руками. Кстати, именно так поступают нередко разработчики игр, чтобы не переписывать уже имеющиеся движки на Java.
Средства разработки для Андроид
Весь основной инструментарий для разработки приложений под Андроид бесплатен и доступен для свободного скачивания с официальных ресурсов.В первую очередь, это Java Development Kit - JDK, "Инструментарий разработки на Java". Его необходимо скачать в любом случае, даже если вы будете писать чисто "нативные" приложения. JDK включает в себя не только компилятор Java, но и другие инструменты, необходимые для создания конечного продукта - apk - пакета, готового к загрузке на Андроид-устройство. Скачать его следует с сайта Oracle.
Далее - Android SDK Tools (Software Develpment Kit) - собственно, набор инструментов для разработки под Андроид. Вы можете скачать полный набор, включающий IDE - Android Studio, или только SDK Tools. Для наших целей Android Studio не нужен - мы будем писать программы на Harbour, а собирать apk посредством инструментов командной строки - по крайней мере, пока не сделаем свою IDE. После установки Android SDK Tools надо запустить SDK Manager и доустановить некоторые компоненты - Platform-tools, Build-tools, SDK platform нужной версии, например, последней (хотя я установил у себя 4.4.2 ), эмулятор - для отладки очень полезная штука, Support library, может понадобиться Google USB Driver - если вы будете устанавливать свое приложение на устройство посредством USB.
И, наконец, Android NDK - Native Development Kit, инструменты для разработки "нативных" приложений - поскольку мы будем писать не на Java, или, не только на Java, это нам понадобится.
Итак, еще раз по пунктам:- Скачиваем JDK,
распаковываем ( в Windows по умолчанию - в
C:\Program Files\Java\jdk1.7.0_71
, если это JDK7 ). - Скачиваем Android SDK Tools,
распаковываем куда нравится, например, в
c:\android\sdk
, запускаем SDK Manager и доустанавливаем Platform-tools, Build-tools, эмулятор, ... - Скачиваем Android NDK,
распаковываем куда нравится, например, в
c:\android\android-ndk-r10d
Каким путем идти дальше?
(Рассмотрим способы создания Харбор-приложений для Андроид)
Сразу скажу, что, в любом случае, мы будем использовать JNI - специальное API для
подключения C/C++ модулей к Java-программам. JNI позволяет вызывать C функции
из Java и, наоборот, Java методы из C. К счастью, исходники Харбора у нас есть и мы можем без
особых проблем создать libharbour.so
- динамическую библиотеку, которую можно подключить к
Андроид-приложению. Эта библиотека содержит виртуальную машину Харбора, выполняющую скомпилированный Харбор-код
и Run-time библиотеку Харбора со всеми знакомыми нам функциями. Поэтому все, что можно сделать с помощью
"нативного" C-кода, можно сделать и из Харбор-программы, она тоже будет "нативной"
в терминологии Java/Android и может быть подключена через JNI.
Часто "нативные" модули используются только для реализации каких-то определенных функций. Они вызываются из Java-программы, производят какие-то вычисления и возвращают результат. Это делается в тех случаях, когда программист ожидает получить существенный выигрыш в производительности или если соответствующий модуль на C у него уже есть и он не хочет переписывать его на Java. Но это не наш случай. При таком подходе требуется писать каждый раз и определенное количество Java-кода, мы же хотим получить возможность писать программы, включая пользовательский интерфейс, только на своем языке, в нашем случае - на Харборе.
Есть, как минимум, 3 способа реализации нашей задачи
1) "нативный" интерфейс. Все писать на Харборе. Интерфейс в этом случае надо "рисовать руками" с помощью, например, OpenGL - т.е., потребуется создать соответствующую библиотеку - надстройку над OpenGL. Скорее всего, именно такой подход реализуется во фреймворках, основанных на QT ( не уверен на все 100%, потому что не видел близко эти продукты, но думаю, что так оно и есть ). Сюда же включу другой подобный вариант - писать консольные приложения, а ввод/вывод консоли перенаправить так, как это сделано, например, в Терминалах для Андроид - есть и Open Source проект терминала.
2) Веб-интерфейс. Использование WebView для построения интерфейса. Есть среди GUI элементов Андроид WebView - встроенный броузер. В него можно загружать веб-страницу, указав url, или строку с html-содержимым, которую можно взять из заранее подготовленного файла или сформировать динамически. Эта строка может содержать и css, и javascript, что позволяет использовать все богатство и разнообразие современного веб-интерфейса. И еще один очень важный момент: есть возможность "прокинуть мост" между javascript-кодом, загруженным в WebView, и Java-кодом приложения, а, значит, и "нативным" кодом - вызывать из javascript функции и методы, реализованные в нашем приложении и получать результат их исполнения. Т.е., мы можем использовать веб-интерфейс как интерфейс приложения, обрабатывать события от элементов ввода и пр.. Такой подход используется во многих фреймворках, например, в PhoneGap и rfoBasic. Реализация этого варианта на Харбор представлена здесь: смотрите h4aFirstApp.
3) HDroidGUI. Я дал этому варианту название моего фреймворка, который его реализует. В рамках этого подхода используются родные ( не путать с "нативными"! ) компоненты GUI Андроид. Они создаются динамически средствами Java на основе "описания", созданного в Харбор-программе. Фреймворк включает в себя набор классов Java, которые "умеют" создавать компоненты интерфейса на основе "описаний" определенного формата и набор классов Харбор, которые создают эти "описания". Харбор-программист создает интерфейс, пользуясь знакомыми синтаксическими средствами, похожими на те, что используются в HwGUI и других GUI библиотеках. Харбор - классы нашего фреймворка создают строку с "описанием" этого интерфейса и посылают ее Java-методам фреймворка, которые и создают GUI компоненты Андроид. Подробнее об HDroidGUI смотрите здесь.
Как видите, я выбрал для себя третий подход, хотя отдал дань внимания и второму. Во-первых, я вообще предпочитаю на каждой платформе использовать по возможности родной интерфейс. Так, HwGUI для Windows использует WinAPI, а для Linux - GTK. Родной интерфейс Андроид тщательно проработан, обладает богатыми возможностями, поэтому я считаю его использование оптимальным вариантом. Вариант с веб-интерфейсом, при всей его привлекательности, добавляет в список языков, которые необходимо использовать при разработке приложения, еще и javascript, css и, возможно, какой нибудь javascript-фреймворк типа jquery, что усложняет процесс программирования. Что касается первого варианта, то написать библиотеку, реализующую GUI-интерфейс, не слишком сильно уступающий родному - очень трудоемкая задача. А использовать QT мне лично не хочется - слишком уж "тяжелый " этот продукт и реализация даже небольшого приложения выльется в многомегабайтный пакет.
Еще раз хочу подчеркнуть, что, хотя я здесь говорю в основном об использовании Харбор, на его месте может быть и код, написанный на другом языке, на том же С, например.
В заключение скажу, что есть еще один возможный способ решения нашей задачи - реализации возможности писать на Харбор для Андроид. Этот способ не использует "нативный" код и JNI и реализован в таком довольно известном коммерческом продукте, как Basic4android Он заключается в том, что специальный компилятор просто преобразовывает текст программы на каком-то языке ( Харбор, Бейсик,... ), точнее, на его подмножестве, в текст на Java. Можно и так, конечно...
Tweet