Предисловие


Если вы задумались о создании мобильных приложений, но не знаете с чего начать, у вас есть достаточно времени на эксперименты и изучение нового, то позвольте порекомендовать вам в качестве инструмента выбрать язык программирования haxe. Возможно, вы о нем уже слышали и возможно, слышали о нем, как о некоторой замене для Flash'a. Это не совсем так, и можно даже сказать совсем не так.

Да, стандартная библиотека haxe имеет подмножество классов и функций, организационно похожих на стандартную библиотеку actionscript 3. Но это не мешает создавать приложения для нативных пла��форм, таких как Linux, Windows, Android, Mac, iOS.

При создании приложений для нативных платформ возможностей стандартной библиотеки не хватает и приходится искать сторонние библиотеки или разрабатывать свои. Я пошел по второму пути и для текущего проекта (небольшой игры, похожей на TripleTown по механике) разработал библиотеку для работы с Flurry, Localytics, GooglePlay Game Services и некоторыми другими сервисами.

В представленом ниже переводе, описывается с чего начать, если вы хотите создать библиотеку расширений для haxe и фреймворка OpenFL (бывший NME), в частности. Автор оригинальной статьи Laurent Bédubourg.


Создание простого расширения для OpenFL


До недавнего времени я использовал адобовские инструменты для публикации приложений на iOS и Андроид.

OpenFL набирает обороты и похоже, что достиг достаточного уровня зрелости, так что я решил использовать его для моего следующего проекта.

Использовать высокоуровневые библиотеки клево, но иногда необходимы нативные функции, которые описаны в документации, но не доступны из библиотек. Чтобы решить эту проблему существует адобовский ANE и он, надо сказать, делает это хорошо.

Но как же нам получить такие же возможности в OpenFL? Ниже я опишу мои попытки справиться с этой задачей.

Следующим образом, используя шаблон из OpenFL, можно создать расширение:
$ openfl create extension TestExtension
$ cd TestExtension
$ ls -1
TestExtension.hx   # обертка на языке haxe для вашего расширения
haxelib.json       # описание проекта для haxelib
include.xml        # описание расширения, openfl будет использовать его для
                   # включения в приложение
ndll/              # в этом каталоге будут нативные библиотеки для каждой
                   # платформы
project/           # исходный код расширения

После компиляции расширения под все поддерживаемые платформы в каталоге ndll/ появятся соответствующие нативные библиотеки.
cd project/
haxelib run hxcpp Build.xml
haxelib run hxcpp Build.xml -Dandroid
haxelib run hxcpp Build.xml -Diphoneos -DHXCPP_ARMV7
haxelib run hxcpp Build.xml -Diphonesim

Теперь нам необходимо зарегистрировать наше расширение в haxelib:
cd ..
haxelib dev TestExtension `pwd`

Чтобы убедиться, что создание расширения прошло успешно, сделаем следующее:
mkdir TestApp
cd TestApp

Создадим project.xml:
<?xml version="1.0" encoding="utf-8"?>
<project>
	<meta
        title="TestApp"
        package="me.labe.testapp"
        version="1.0.0"
        company="Laurent Bedubourg"
        />
	<app
        main="Main"
        path="Export"
        file="TestApp"
        />
	<source path="." />
	<haxelib name="openfl" />
  <haxelib name="TestExtension" />
</project>


Main.hx:
class Main {
    public static function main(){
        var t = new flash.text.TextField();
        t.text = Std.string(TestExtension.sampleMethod(16));
        flash.Lib.current.addChild(t);
    }
}

Скомпилируем и протестируем следующим образом:
openfl test project.xml cpp
openfl test project.xml android
openfl test project.xml ios -simulator
openfl test project.xml ios

Все прекрасно работает на Маке и на Андроиде.

Мне все еще нужно разобраться как использовать внешние библиотеки, как структурировать исходный код для различных платформ, но уже это хорошее начало: создать расширение для OpenFL проще, чем расширение для Adobe Air (ANE).

К сожалению, у меня пока остались ошибки линковки для iOS и когда я разберусь с ними, я обновлю эту статью.

В своем репозитории на гитхабе я разместил исходный код примера из статьи. А в блоге Джошуа Граника можно найти статью о создании расширений.

Дополнение: Похоже, что мои проблемы с линковкой под iOS связаны с несоответствием регистров имен импортируемых функций. Как только, эта ошибка будет исправлена, вы сможете без проблем экспериментировать с расширениям с именами в нижнем регистре (как и предполагается под iOS).

Дополнение: Определенно, это проблема несоответствия имен импортируемых функций. В репозитории OpenFL находится описание ошибки, так что вы сможете самостоятельно отследить, когда она будет исправлена.

Дополнение: Джошуа Граник исправил шаблон расширения, так что теперь все будет отлично работать прямо из коробки*.

* от переводчика — я оставил все дополнения в переводе с той целью, что они могут пригодиться кому-нибудь при возникновении подобных ошибок.