AIR 3 Native Extensions для Android - Можно ли / как включить сторонние библиотеки?
Со всей новой шумихой по поводу поддержки собственных расширений в AIR 3 я не нашел ни одной вещи, которая бы подтверждала или опровергала возможность включения и использования внешнего JAR-файла внутри собственной реализации Android.
Все примеры в основном демонстрируют возможность подключения к встроенным API-интерфейсам Android. Но что, если кто-то захочет использовать одну из сотен библиотек, облегчающих эту задачу? Конечно, кажется, что это должно быть возможно. Я постараюсь изложить, что я сделал, и, возможно, кто-то заметит недостаток:
- Успешно создана нативная библиотека Android с использованием встроенного импорта из сторонней библиотеки Android XYZ.
- Экспортированный проект Android в виде файла JAR. Примечание. Указанный сторонний JAR-файл находится в /lib внутри jar-файла.
- Успешно создана библиотека ActionScript (SWC) для взаимодействия с собственной библиотекой Android.
- Создан ANE-пакет из SWC, extension.xml, Android JAR и library.swc (для платформы Android-ARM, извлеченный из SWC).
Примечание. Также пытались поместить стороннюю библиотеку в файловую структуру, описанную здесь: http://help.adobe.com/en_US/air/extensions/WSf268776665d7970d-24823354 12ffea65006-8000.html # WSf268776665d7970d-6be13ace1308aaebeca-7fff. Я думаю, что это больше связано с выполнением типов во время выполнения с JNI или чем-то еще, так что эта статья немного смутила меня. - Использовал ANE в примере проекта Flex Mobile.
- Встроенный и установленный файл APK на тестовом устройстве DroidX.
- Может успешно видеть загрузку приложения AIR (и инструкции трассировки) в LogCat
"ActivityManager: Displayed com.me.androidapp/.AppEntry"
- Может успешно видеть нативный Java-код Android, вызываемый через среду выполнения приложением AIR для создания экземпляров расширения и контекста.
"mye_native: MyExtension.initialize", "mye_native: MyExtensionContext.createContext"
- Как только приложение AIR пытается вызвать нативную функцию, оно взрывается и не может найти классы из сторонней библиотеки Android:
E dalvikvm: Could not find class 'com.thirdparty.SomeClass', referenced from method com.me.nativeExtentions.MyExtensionFunction.call
Есть идеи? Кажется, это должно работать так.
Одна вещь, которую я заметил, это то, что когда я разрываю APK и Dex из моего чистого Java-приложения для Android (которое также имеет сторонние библиотеки Android), оказывается, что классы от сторонних производителей были включены в него (не только ссылка на банку). Когда я делаю то же самое с моим Flex APK, я нахожу только свои собственные классы Java плюс классы Adobe, и я не могу найти сторонние классы, которые я могу видеть.
Я разместил это на форумах Adobe, но решил, что попробую ТАКОЙ мозговой центр. Спасибо.
2 ответа
Вы должны объединить все свои банки в один. Может помочь что-то вроде http://code.google.com/p/jarjar/ или ваш собственный скрипт Ant.
Отредактировано, чтобы добавить пример: Предположим, что ваш основной файл jar расширения - extension.jar, и вы используете код в external.jar. Затем вы можете поместить классы из external.jar в extension.jar, используя инструмент Java jar:
jar -xf external.jar
Это позволит извлечь файлы.class в папки пакетов. Если пакет верхнего уровня - "com", вы можете добавить их в extension.jar с помощью:
jar -uf extension.jar com
(Повторите вторую команду для каждого пакета верхнего уровня во внешнем банке.)
Вы также можете вручную объединить библиотеки jar, превратив их в zip-файлы (просто переименуйте их в.zip) и скопировать классы из сторонней библиотеки в основную и переименовать ее обратно в.jar