Pull to refresh

Android-приложения на JPHP

Reading time3 min
Views19K

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


logo


О языке JPHP


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



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


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


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


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


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


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


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


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


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


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


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


<?
use php\android\app\Application;

$bootstrapActivity = Application::getMainActivity();

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


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


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


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


<?
use php\android\app\Application;
use php\android\widget\Button;

Application::setMainActivityHandler(fn => { // лямбды в jPHP
       $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
Группа в VK

Tags:
Hubs:
Total votes 25: ↑25 and ↓0+25
Comments48

Articles