AIR 3 Native Extensions для Android - Могу ли я / как включить сторонние библиотеки? - PullRequest
11 голосов
/ 12 октября 2011

Со всей новой шумихой, связанной с поддержкой собственных расширений в AIR 3, я не нашел ни одной вещи, которая подтверждает или отрицает возможность включения и использования внешнего JAR-файла в собственной реализации Android.

Все примеры в основном демонстрируют возможность подключения к встроенным API-интерфейсам Android. Но что, если кто-то захочет использовать одну из сотен библиотек, которые делают это проще? Конечно, кажется, что это должно быть возможно. Я постараюсь изложить, что я сделал, и, возможно, кто-то заметит недостаток:

  1. Успешно созданная собственная библиотека Android с использованием скомпилированного импорта из сторонней библиотеки Android XYZ.
  2. Экспортированный проект Android в виде файла JAR. Примечание. Указанный сторонний JAR-файл находится в / lib внутри банки.
  3. Успешно созданная библиотека ActionScript (SWC) для взаимодействия с собственной библиотекой Android.
  4. Создан 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 или чем-то еще, так что эта статья немного смутила меня.
  5. Использовал ANE в примере проекта Flex Mobile.
  6. Встроенный и установленный APK-файл на тестовом устройстве DroidX.
  7. Может успешно видеть загрузку приложения AIR (и инструкции трассировки) в LogCat "ActivityManager: Displayed com.me.androidapp/.AppEntry"
  8. Может успешно видеть нативный Java-код Android, вызываемый во время выполнения приложением AIR для создания экземпляров расширения и контекста. "mye_native: MyExtension.initialize", "mye_native: MyExtensionContext.createContext"
  9. Как только приложение 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 ]

5 голосов
/ 02 ноября 2011

Вы должны объединить все свои банки в один. Что-то вроде http://code.google.com/p/jarjar/ или ваш собственный скрипт Ant поможет.

Отредактировано, чтобы добавить пример: Предположим, что ваш основной файл jar расширения - extension.jar, и вы используете код в external.jar. Затем вы можете поместить классы из external.jar в extension.jar, используя инструмент jar Java:

jar -xf external.jar

Это позволит извлечь файлы .class в папки пакетов. Если пакет верхнего уровня «com», вы можете добавить их в extension.jar с помощью:

jar -uf extension.jar com

(повторите вторую команду для каждого пакета верхнего уровня во внешнем банке.)

3 голосов
/ 08 августа 2012

Вы также можете вручную объединить библиотеки jar, превратив их в zip-файлы (просто переименуйте их в .zip) и скопировать классы из сторонней библиотеки в основную и переименовать ее обратно в .jar

...