Хабрахабр

[Из песочницы] Android-приложения на JPHP

Да, я в курсе что раньше на Хабре уже был способ писать Android-приложения на PHP, но было принято решение адаптировать его под более быстрый и совместимый с Java JPHP. Люди которые пишут код на PHP сделают всё чтобы не переходить на другие языки.

logo

О языке JPHP

А что за JPHP? Я предполагаю, что у вас может возникнуть вопрос. Ответ есть тут-же, на Хабре:

За те 4 года которые прошли с момента написания этих постов о JPHP этот язык поменялся в лучшую сторону. Ну, а мы продолжим. К примеру появился собственный пакетный менеджер jppm про который нам тоже сегодня придётся поговорить.

Как всё началось

Я дал почитать ему тот пост, про который мы говорили в начале, но ему этот способ не понравился так как там используется обычный PHP. Всё началось с того, что моему другу пришла идея создавать приложения для Android на JPHP. Ну, а мы разработчики, которые пишут на никому не известном языке JPHP решили сделать всё сами.

Да и сам создатель этого языка хотел использовать именно его в качестве GUI движка для JPHP за 2 года, так ничего и не сделав. Полистав интернет, мы тогда не нашли другого выхода, кроме как использовать JavaFXPorts.

Я бросился глобально изучать работу языка JPHP. Как говорится — «Кто кроме тебя»?..

Я уже написал автоматическую генерацию build скрипта для gradle и всё бы хорошо, apk собирался, но при запуске выдавалась неизвестная мне на то время ошибка. Первые несколько недель были неудачными. Сейчас я могу сказать точно что эта ошибка была из за сгенерированного байт-кода. Я сразу понял что она из-за JPHP но не видел я прежде такую. Именно это стало огромным препятствием. DalvikVM банально не мог запустить байт-код сгенерированный для JVM. Был вариант с файлами phb, но это не решало нашу задачу вовсе. Так как PHP файлы в JPHP приложениях не компилируются вовсе. Единственным способом стало написание собственного компилятора, что действительно сработало, но принесло ряд ограничений связанных с include и eval, спасибо, Dalvik.

Её исходники находятся тут. После многих проб и ошибок я всё же сумел сделать самую первую версию. Да и использовать JavaFX на Android это мазахизм. Эта версия была не очень быстрая.

Принял я это решение относительно недавно. По этому я принял решение переписать всё с чистого листа. Но работает. По этому библиотека для JPHP немного сыровата.

Как это работает

После чего компилируя в них все файлы php в class файлы. Всё начинается с того что jppm собирает все ваши исходники и зависимости в один jar файл. А он уже в свою очередь компилирует эти class файлы в dex. После чего полученный jar файл добавляется в зависимости к gradle. В этом весь секрет.

В AndroidManifest.xml изначально всего один BootstrapActivity который загружает весь JPHP. С запуском приложения всё сложней. Для Activity я создал одноимённые классы. После загрузки этот BootstrapActivity можно будет изменять из JPHP.

<?
use php\android\app\Application; $bootstrapActivity = Application::getMainActivity();

С помощью этого кода можно получить тот самый BootstrapActivity из которого был загружен JPHP.

Я думаю вам уже стало понятно о работе загрузчика JPHP.

Небольшой пример

К примеру для того чтобы создать самый примитивный кликер нужно использовать вот этот код :

<?
use php\android\app\Application;
use php\android\widget\Button; $activity = Application::getMainActivity(); // Получаем BootstrapActivity
$activity->setTitle("test"); // Добавляем заголовок $activity->setContentView($button = new Button($activity)); // Создаём и добавляем кнопку $button->text = "Hello from JPHP!"; // Ну тут всё понятно
$button->on("click", function () use ($button) { // При нажатии на кнопку ... $GLOBALS['clicks']++; $button->text = "Clicks: " . $GLOBALS['clicks'];
});

В итоге мы получили простое приложение с кнопкой:

Заключение

Так как он не описывает пока что и 10% Android API. Я не думаю что мой проект кому либо будет интересен. Но думаю проект найдёт свою аудиторию. Да и написание приложений для Android на PHP не канон.

→ Github проекта
→ Github JPHP

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть