
Содержание статьи
Адриана Д. Финли

Знаете ли вы, что вы можете использовать Java для создания кроссплатформенных мобильных приложений? Да, ущипни себя, ты правильно прочитал с первого раза! Я научу вас основам того, как использовать существующие знания Java для создания производительных программ на Android и iOS в 12 простых шагах. Мы сделаем это все, используя JavaFX в качестве инструментария GUI.
Но сначала немного переднего плана. Вам нужно будет отвечать следующим требованиям, чтобы иметь возможность создать приложение оба Android и iOS. Однако, если вы не хотите создавать приложение iOS, вы можете смело разрабатывать на любой x64-разрядной машине, поддерживающей Java SE 8. Этот проект будет репозиторием Git, созданным с помощью gradle. Но вам не нужно создавать репозиторий Git.
Ниже приведено требования:
- JDK 1.8 JVM
- Инструменты командной строки Android (SDK версии 27)
- XCode 9.2
- Gradle 4.2
- Большое хранилище Git файлов (v.2.5.0) (Не нужно, если вы не хотите создавать репозиторий git)
- Желательно не менее 4G RAM
Нетерпеливый? Хотите увидеть конечный результат? Просмотрите готовый проект ниже.
afinlay5/OnyxFx
Репозиторий исходного кода Gradle для OnyxFx, кроссплатформенного (Android/iOS/Linux/macOS/Windows) программы для воспроизведения JavaFX…github.com
Моей средой разработки будет Fedora Linux 28 и macOS High Sierra. Теперь, когда мы разобрались с этим, давайте зарыться.
1) Создайте папку для размещения проекта
Я разместил свой проект OnyxFx следующим образом: «/home/adriandavid/Projects/OnyxFx”. Вы, конечно, можете свободно размещать проект где угодно.

2) Инициализируйте gradle, Git, установите JAVA_HOME
Откройте терминал в корне каталога проекта. Если gradle правильно настроен, вы должны увидеть нечто подобное после выполнения такой команды:
gradle -v

Вам нужно убедиться, что gradle перечисляет вашу установку Java Development Kit (JDK) 8 рядом с разделом с пометкой JVM.
Хотя существует много способов сделать это, самый простой способ – убедиться, что переменная среды JAVA_HOME правильно установлена.
В зависимости от среды, существует много способов сделать это. Один из способов сделать это в большинстве сред *nix — установить переменную в /home/<користувач>/.bзолаrc или /etc/proфайл. Проверьте руководство для вашей операционной системы, чтобы убедиться, что переменная среды JAVA_HOME настроена правильно.
Вы можете включить следующие строки в конец .bashrc или профиля, чтобы убедиться, что JAVA_HOME установлен правильно.
JAVA_HOME=/home/adriandavid/java/oracle_jdk1.8.0_181/export JAVA_HOME
Примечание: Вы можете установить Oracle JDK 8 здесь.
Затем убедитесь, что оболочка отображает приведенные выше изменения, выполнив одну из следующих команд:
source ~/.bashrcsource /etc/profile
Введите такую команду, чтобы убедиться, что переменная установлена правильно:
echo $JAVA_HOME

Если у вас все еще возникают трудности или используете Microsoft Windows, см. раздел здесь.
Сначала бегайте git init
в корневом каталоге проекта, чтобы инициализировать репозиторий Git. Если вы не хотите размещать репозиторий git, вы можете пропустить этот шаг.
Во-вторых, бегайте gradle init
в корневом каталоге проекта, чтобы инициализировать репозиторий gradle. Этот шаг необходим.

Примечание: Вы заметите, что мой пример выглядит несколько иначе. Это потому, что у меня уже есть gradle и Git, инициализированные в моей локальной среде.
3) Будь здоров! Редактировать gradle.build и
Надеюсь Земля, ветер и огонь может помочь вам стать хорошим! Включите свой любимый текстовый редактор и отредактируйте build.gradle, расположенный в корневом каталоге вашего проекта, и замените содержимое следующего содержания GitHub.
Эти параметры build.gradle настраивают наш проект gradle на использование javafxmobile плагин, который является рабочим конем нашего проекта. Вы можете узнать больше о плагине здесь и здесь. Среди многих вещей, плагин javafxmobile автоматизирует процесс загрузки (с Maven Central или jcenter) и добавление пакетов SDK для iOS и Android к классу вашего приложения.
Если вы знакомы с gradle, maven или ant, прекрасно – вы, наверное, имеете представление о происходящем. Если вы не знакомы с gradle, не волнуйся об этом. Все, что вам нужно понимать, это то, что gradle это инструмент сборки, который используется для автоматизации многих задач, связанных с созданием программ, таких как: захват зависимостей, организация проекта и т.д.
Обратите внимание, что мы ориентируемся на Android 7.1 Nougat (API версии 25) и iOS 11 (в скором времени мы увидим, где это будет сделано). Вы можете настроить эти значения, как вы считаете нужным. Однако заметьте, что в случае Android вы должны убедиться, что версия API соответствует версии SDK, которую вы загрузили (подробнее об этом позже).
Наконец я не буду демонстрировать создание подписанных исполняемых файлов в этом учебнике. По этой причине, iOSSkipSigning имеет значение true, и мы не используем выпуск Android Gradle задачи. Однако вы можете предоставить соответствующие условия для создания подписанных программ.
4) Создайте новый файл под названием gradle.properties и настройте его
Создайте новый файл в корневом каталоге проекта под названием gradle.properties
и добавьте в файл следующее содержимое.
robovm.device.name=iPhone-7robovm.sdk.version=11.0org.gradle.jvmargs=-Xms4g -Xmx8g
Эти настройки сообщают плагину javafxports использовать iPhone-7 как встроенный эмулятор, нацеливаться на iOS 11 и передавать флаги Xms и Xmx в JVM, определяющую как начальный пул памяти до 4 ГБ, так и максимальную память кучи. пул до 8 Гб. Это пригодится для компиляции openJDK и разработки сборки iOS.
5) Установите Homebrew (только для iOS)
Если у вас нет Mac и не собираетесь создавать сборку iOS, смело упустите этот шаг.
Откройте терминал в MacOS и вставьте следующую команду.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
6) Установите разъем USB мультиплексирования (только для iOS)
Перейдите к этому шагу, только если Homebrew успешно установлен. Если у вас нет Mac и не собираетесь создавать сборку iOS, смело упустите этот шаг.
Откройте терминал в MacOS и вставьте следующую команду.
brew install usbmuxd
7) Возьмите инструменты командной строки Android
Возьмите инструменты командной строки Android для вашей платформы здесь. После загрузки распакуйте папку и вставьте содержимое в нужный каталог. Для меня это было /home/<user>/A
ndroid.

8) Установите Android_HOME, захватите необходимые пакеты Android
Как и в случае с Java, gradle должен знать, где искать инструменты командной строки Android. Есть несколько способов сделать это. Однако в духе простоты и последовательности установим переменную среды ANDROID_HOME в этом учебнике. Разместите следующую переменную так же, как мы это сделали для JAVA_HOME. Например:
ANDROID_HOME=/home/adriandavid/Android/ export ANDROID_HOME
Не забудьте перезагрузить оболочку, добавив source <fi
le> как мы сделали для JAVA_HOME.
Теперь возьмите инструменты, необходимые для создания коллекции Android. Выполните следующую команду:
# *.nix./sdkmanager "platform-tools" "build-tools;25.0.3" "platforms;android-25" "extras;android;m2repository" "extras;google;m2repository"
or
#Windowssdkmanager "platform-tools" "build-tools;25.0.3" "platforms;android-25" "extras;android;m2repository" "extras;google;m2repository"
Обратите внимание, что версия SDK и API, которые мы указали в gradle.build, соответствуют версии, которую мы указали в этой команде. А именно «25». Если это неправильно, построение не получится.
9) Создайте структуру каталогов программы
Чтобы автоматизировать процесс создания этих каталогов, выполните следующий сценарий оболочки.
Bourne-Again Shell / Korn Shell:
Оболочка Windows (cmd):
Сохраните файл как mkpdir.bat или mkpdir.sh и запустите файл из корневого каталога проекта как корень (или Администратор).
# *.nixchmod +x mkdir.sh-sh ./mkpdir.sh
# Windowsmkpdir
Обратите внимание на то, что мы создали каталоги для встроенных и рабочих столов. Мы создадим настольный сборник, потому что для этого не требуется дополнительной работы. Однако мы не будем производить сборки для встроенных устройств.
10) Создайте свою программу JavaFX!
Выделите /src/
Начать можно с простого Привет Мир приложение или посмотрите на исходный код, который я собрал здесь. OnyxFx — это приложение, которое я создал, следуя этим инструкциям, осуществляющим вызовы REST через HTTP к OnyxFxAPI. API, в свою очередь, является веб-скребком, возвращающим статистические данные (очки за игру, подбор за игру, результативные передачи за игру) для игрока NBA® и сезона, определяемого клиентом. Он возвращает данные в формате JSON, которые затем анализируются и отображаются на экране мобильного приложения. Не стесняйтесь редактировать его!
Имейте в виду, что хотя вы можете поделиться исходным кодом, вы должны включить пользовательские изменения в каждую копию исходного кода, если вы хотите внести изменения, специфические для устройства.
Также заметьте, что базовый компилятор (раздел RoboVM от MobiDevelop) не полностью поддерживает все API Java 8. Если вы очень внимательно посмотрите на мой исходный код, вы заметите, что в версии исходного кода для iOS я удалил неподдерживаемый API, например java.util.function.BiConsumer и java.util.Map.replace().
11) Создайте RAM-диск для сборок iOS (только для iOS)
Процесс компиляции для iOS очень труден, поскольку плагин дважды компилирует весь openJDK и другие библиотеки, чтобы создать толстый JAR, который он будет использовать для создания программы. Поэтому вы должны заранее создать диск RAM, чтобы удовлетворить требования к памяти.
Однако этот шаг зависит от вашей оценки возможностей вашей машины. Для контекста машина macOS, которую я использовал для компиляции моей программы iOS, имеет 4 ГБ оперативной памяти DDR2. Я решил совершить диск на 8 Гб оперативной памяти. Для этого выполните следующую команду в терминале.
SIZE=8192 ; diskutil erasevolume HFS+ ‘RoboVM RAM Disk’ `hdiutil attach -nomount ram://$((SIZE * 8192))`
12) Создайте и запустите свою программу!
Чтобы создать свое приложение, запустите обертку gradle в корневом каталоге из терминала, как показано ниже.
./gradlew clean build
Это создаст настольную программу, упакованную в виде JAR со сценариями для запуска программы /build/distributions/<AppName.t
ar>; and /build/distributions/<App
Name.zip>. Если вы распакуете каталоги, вы заметите следующую структуру:

Обратите внимание, что в /bin есть скрипты для выполнения программы. Эти сценарии полагаются на сохранение текущей структуры папок. Также заметьте, что вам не обязательно иметь дерево установлено. Он использован здесь прямо в иллюстративных целях.
Кроме того, существует отдельный JAR, который можно использовать для выполнения приложения на любом рабочем столе, поддерживающем JavaFX 8. Чтобы запустить приложение, выполните одно из следующих действий.
# Navigate to /build/distributions/<ProjectName>/
#On *.nixcd bin./<ProjectName>
#On Windowscd bin<ProjectName>
#Platform agnosticjava -jar OnyxFxMobile.jar (or double click, if jvm is configured to run .jar files)
Note: If the executable providing "java" is not the same vendor and/or version of the Java 8 JDK with which you built this application, the jar may not run. JavaFX 8 builds between the openJDK & Oracle JDK are incompatible.
Otherwise: /location/to/java8/bin/java -jar <ProjectName>
Просмотрите задачу gradle этого проекта
Вы можете просмотреть задачу gradle этого проекта, выполнив следующее в корневом каталоге проекта.
./gradlew tasks
Для компиляции запустите на рабочем столе
Следующая команда запустит ваш проект в среде хоста.
./gradlew jar./gradlew run
Вы найдете отдельную баночку build/libs/<AppName&g
t;.jar .
Для компиляции запустите на Android
./android #Generates a debug Android apk containing the JavaFX application.
./androidInstall #Launch the application on a connected android device.
./androidRelease #Generates a release Android apk containing the JavaFX application.
Note: You will need to configure a valid signingConfig when releasing an APK (javafxports).
Вы найдете два APK build/javafxports/android
.
Первый будет назван <AppName&g
t;.apk.
Второй будет named <AppName>-u
naligned.apk.
Для компиляции запустите iOS
./createIpa - Generates an iOS ipa containing the JavaFX app.
./launchIOSDevice - Launches app on a connected ios device.
./launchIPadSimulator - Launches app on an iPad simulator.
./launchIPhoneSimulator - Launches app on an iPhone simulator.
Вы найдете три исполняемых файла build/javafxports/ios
.
Первый будет назван <AppName&g
t;.ipa.
Второй будет named <AppN
ame>.dSYM.
Третий will be named &
lt;AppName>.app.
Некоторые снимки экрана моего образца программы
На рабочем столе

На Android

На iPhone

На iPad

Заставка

Мои заключительные мнения
javafxports представляет собой перспективный проект, целью которого является внедрение JavaFX и платформы Java SE на мобильные и другие устройства. В определенном смысле этот инструмент аналогичен Xamarin в своих усилиях. Однако над проектом еще много работы.
Для начала плагин не полностью поддерживает Java 8. На Android он использует retrolambda для обработки выражений Java 8 Lambda и ссылок на методы. Технически это касается Java 6. Дополнительные зависимости позволяют использовать Java 8. Однако процесс прост, сборки работают должным образом, а время компиляции не слишком долго.
Однако на iOS сборки очень загружают память, а процесс компиляции занимает очень много времени. Ниже приведен фрагмент журнала для задания ./gradlew createIpa.
:createIpa (Thread[Task worker for ‘:’,5,main]) completed. Took 1 hrs 46 mins 40.198 secs.
В общей сложности процесс потреблял около 6 ГБ оперативной памяти на моей машине. Это вряд ли идеально. Однако будущее многообещающее. Компания под названием Gluon разработала высокопроизводительную полностью модульную собственную JVM, полностью поддерживающую Java 9, о которой вы можете прочитать здесь.
Эта статья первоначально опубликована в разделе блога моей домашней страницы здесь.
Ресурсы для изучения:
