Основы Native Extension на Java для AIR

в 15:47, , рубрики: Action Script, adobe air, android, flash, Flash-платформа, java, native extension, метки: , , , ,

Здравствуйте уважаемые хабрачитатели. Мой рассказ как видно по названию темы пойдет о основе и особенностях создании adobe native extension(далее ANE) для Adobe AIR, в моем случаи расширения буду писать на java, для расширения функциональности AIR, на платформе Android. И так с вашего разрешения начнем.

Введение.

Что же такое ANE? Это инструмент который появился с версии Adobe AIR 3.0 и выше, он позволяет извлекать и выполнять куски нативного кода из среды AIR, условно мы можем выполнить любой нативный код. Выглядит расширение в виде скомпилированного файла библиотеки с расширением .ane.

Что нужно для работы

Для начала работы нам понадобится:
1. В качестве IDE Eclipse.
2. Flash Builder 4.6 plugin
3. ADT plugin.
4. Adobe AIR SDK.

Как все это запускать и писать код объяснять не буду потому, что эта тема уходит за пределы данной статьи, по умолчанию статья предполагает, что вы владеете всеми этими тонкостями..

О программировании расширения на JAVA.

Для начала давайте создадим Android проект, предварительно пометив его как библиотека и самое главное не забудем название пакета, это название будет описано в файле описания расширения чуть позже.
Основной класс расширения по своей сути реализует интерфейс FREExtension… этот интерфейс как и многие другие классы, поставляется отдельной библиотекой от adobe, где же нам найти эту библиотеку? Ее можно найти внутри архива AIR SDK, по адресу lib/android/. Библиотеки называются FlashRuntimeExtensions с расширениями jar и so. Мы пишем на java по сему нам нужен jar, берем нашу библиотеке и подключаем ее к нашему проекту. И так давайте создадим основной класс нашего расширения, он должен иметь следующую структуру:

@Override
public FREContext createContext(String arg0) {
	return null;
}
@Override
public void initialize() {
}
@Override
public void dispose() {
}

Как видим структура нашего класса довольно таки просто, три обязательных метода, с методами dispose и initialize думаю и так все ясно вызываются при инициализации и уничтожении расширения. Интересен метод createContext. Условно у расширения имеется свой контекст который будет описывать функционал нашего расширения, как мы понимаем класс нашего будущего контекста должен расширять класс FREContext. Давайте создадим класс нашего контекст, класс должен иметь следующую структуру:

@Override
public Map<String, FREFunction> getFunctions() {
	return null;
}	
@Override
public void dispose() {
}

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

@Override
public FREObject call(FREContext context, FREObject[] args) {		
	return null;
}

Как видим тут у нас только один обязательный метод. Доступ к activity текущего приложения можно получить через экземпляр класса FREContext, который мы получаем как параметр в нашей функции, вполне логическим методом getActivity() и уже имея родной андройдовский activity можно делать с ним все, что душе вашей угодно. Так же у экземпляра класса FREContext есть метода dispatchStatusEventAsync, который позволяет совершать обратный вызов в as3, результаты которого можно прослушать событием StatusEvent.STATUS. Второй параметр метода это массив классов FREObject, это все параметры которые будут передаваться нашему контексту из as3. Экземпляр класса FREObject имеет набор методов для преобразования в соответствующий тип данных.
На этом закончим с частью java и перейдем к as3.

О программировании расширения на AS3.

Для создания библиотеки давайте создадим проект Flex библиотеки, при этом не забудем импортировать AIR классы, а так же пакет классов должен быть идентичен тому же что и в java.
Основной класс на as3 может расширять что угодно, просто создайте класс и в нем создайте экземпляр класса ExtensionContext, создается он следующим образом:

var extContext:ExtensionContext = ExtensionContext.createExtensionContext("имя пакета расширения", "тип контекста");

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

extContext.addEventListener(StatusEvent.STATUS, onStatus);

так же можно вызвать метод который мы описали в контексте в java следующим образом:

extContext.call("имя вызываемого метода", ..."массив параметров передаваемый функции расширения)

Все довольно просто, давайте теперь попробуем собрать наш ane.

Сборка ANE.

И так после всех наших трудов у нас на руках должна быть swc-ка с нашего flex проекта и jar с нашего андройд проекта.
Давайте создадим отдельную директорию, и внутри нее организуем следующую иерархию:

Основы Native Extension на Java для AIR

Внутри папки android должна лежать наша jar библиотека, в случаи если вы разрабатываете ane для ios или еще чему подобному директория должна соответствовать его названию. Еще один важный перед компиляцией надо из swc библиотеки вытащить файл library.swf(открыть ваш swc файл с помощи, архиватора winrar например) и забросить ее в каждую директорию. Примерно директория android будет иметь два файла и выглядеть так:

Основы Native Extension на Java для AIR

А директория default будет содержать в себе один лишь library.swf файл.
Теперь нам надо описать наше расширение в дескрипторе это файл extension.xml, в нашем случаи он будет выглядеть примерно так:

<extension xmlns="http://ns.adobe.com/air/extension/3.1"> 
    <id>пакет расширения</id> 
    <versionNumber>версия расширения</versionNumber> 
    <platforms> 
        <platform name="Android-ARM"> 
            <applicationDeployment>
                <nativeLibrary>test.jar</nativeLibrary>
                <initializer>полный путь вместе с пакетом к java классу расширения</initializer>
            </applicationDeployment> 
        </platform>
        
        <platform name="default">
            <applicationDeployment/>
        </platform>
    </platforms> 
</extension>

Ну теперь у нас все почти готово осталось просто собрать нашу библиотеку, для этого выполняем с консоли(не забудьте в переменных среды прописать путь к бинарникам Adobe AIR) следующую программу:

adt -package -target ane extension.ane extension.xml -swc test.swc -platform Android-ARM -C android . -platform default -C default .

Где extension.ane это наша ane которое будет создано, а test.swc это наша flex библиотека. В итоге вы получите ane файл который можете использовать.

На этом на этом наверно я закончу с основами. Спасибо за уделенное время и терпение, а если кому интересно ждите продолжения.

Автор: koras_dor

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js