AIR 3 Native Extensions для Android - Можно ли / как включить сторонние библиотеки?

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

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

  1. Успешно создана нативная библиотека Android с использованием встроенного импорта из сторонней библиотеки Android XYZ.
  2. Экспортированный проект Android в виде файла JAR. Примечание. Указанный сторонний JAR-файл находится в /lib внутри jar-файла.
  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 ответа

Решение

Вы должны объединить все свои банки в один. Может помочь что-то вроде 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

Другие вопросы по тегам