Существуют устройства Android на процессорах с архитектурами наборов инструкций (ISA) ARM или x86. Различные архитектуры наборов инструкций не имеют двоичной совместимости, поэтому приложение, содержащее нативный код, должно содержать нативные библиотеки для каждой архитектуры. Одним из механизмов распространения таких приложений являются так называемые «толстые» пакеты приложений Android («толстые» APK).
В этой статье содержатся пошаговые инструкции по созданию такого «толстого» пакета APK, включающего независимые от архитектуры файлы для виртуальной машины Dalvik (Dalvik, 2013), а также библиотеки для разных архитектур. В статье описывается сборка нативной библиотеки приложения x86 с помощью Intel® Integrated Native Developer Experience (INDE).
Для демонстрации используем пример hello-jni из дистрибутива NDK r10 (входящий в состав установки Intel® INDE).
Подготовка среды сборки
Необходимы следующие программные средства. Установите их, следуя приведенной инструкции.
1. Установите:
Microsoft .NET Framework,
пакет Java Development Kit 7u67 должен быть установлен в [jdk7-dir].
2. Добавьте эту папку в переменную среды PATH:
каталог [jdk7-dir]jrebin для использования виртуальной машины java. Это требуется для ant.
Для среды Windows не забудьте указать краткое имя папки (вида PROGRA~2) для program files (x86).
3. Создайте новую переменную среды:
JAVA_HOME=[jdk7-dir].
4. Установите:
пакет Intel® Integrated Native Developer Experience должен быть установлен в [inde-dir].
5. Добавьте эту папку в переменную среды PATH:
каталог [ant-dir]bin для использования средства ant (расположение [ant-dir] по умолчанию: [inde-dir]IDEintegration)
Сборка из командной строки
В этом разделе содержатся инструкции по созданию пакетов APK для поддержки устройств Android с архитектурой ARM и x86 в среде сборки с командной строкой.
Откройте окно командной строки или окно терминала в Linux; перейдите в папку примеров Android NDK «hello-jni» [ndk-dir]sampleshello-jni; выполните следующие действия.
Примечание. Все средства, перечисленные в разделе выше, должны быть доступны из этого окна.
1. Настройка приложения
Выполните следующую команду в папке hello-jni для создания файла build.xml, который будет впоследствии использован для сборки примера.
$ android update project --target android-19 --name HelloJni --path. --subprojects
Примечание. --target android-19 соответствует версии Android 4.4 (KITKAT).
2. Очистка рабочей области приложения
Используйте следующую команду для очистки всей рабочей области, включая библиотеки, для всех архитектур ISA.
$ ant clean
$ ndk-build V=1 APP_ABI=all clean
Примечание: V=1: печать всех команд по мере их выполнения. APP_ABI=all: принудительная очистка всех промежуточных файлов для всех целевых платформ. Если не указать этот параметр, будет очищен только файл для целевой платформы armeabi.
3. Сборка двоичных файлов для архитектуры ARM
Используйте указанную ниже команду для сборки двоичного файла приложения для архитектуры ARM:
$ ndk-build APP_ABI=armeabi-v7a V=1 NDK_TOOLCHAIN=arm-linux-androideabi-4.8
Примечание: APP_ABI=armeabi-v7a: настройка компиляции для целевой платформы ARM. NDK_TOOLCHAIN=arm-linux-androideabi-4.8: вместо используемого по умолчанию GNU gcc 4.6, используется gcc 4.8.
Двоичный файл приложения (libhello-jni.so) создается по адресу .libsarmeabi-v7alibhello-jni.so.
4. Сборка двоичных файлов для архитектуры x86 с помощью компилятора Intel
Используйте указанную ниже команду для сборки двоичного файла приложения для архитектуры x86 с помощью компилятора Intel.
$ ndk-build APP_ABI=x86 V=1 NDK_TOOLCHAIN=x86-icc NDK_APP.local.cleaned_binaries=true
Примечание: APP_ABI=x86: настройка компиляции для архитектуры x86. NDK_TOOLCHAIN=x86-icc: замена используемого по умолчанию компилятора gcc 4.6 на компилятор Intel C/C++ для Android. NDK_APP.local.cleaned_binaries=true: отмена удаления библиотеки в каталоге libs/armeabi. См. примечания ниже.
Двоичный файл приложения (libhello-jni.so) создается по адресу .libsx86libhello-jni.so.
5. Подготовка пакета приложения (APK)
После сборки всех двоичных файлов для каждой целевой платформы Android убедитесь, что папка libs[targetabi] содержит требуемые библиотеки для каждой целевой архитектуры.
Чтобы упростить создание пакета и избежать его подписания, используйте следующую команду для создания отладочного пакета.
$ ant debug
После этого новый пакет HelloJni-debug.zip появится в папке .bin. Его можно запустить в имитаторах x86 или ARM, поддерживающих API уровня 19 или выше, содержащихся в Android SDK.
Пакет HelloJni-debug.zip содержит библиотеки для двух целевых платформ: ARM EABI v7a и x86.
Сборка в интегрированной среде разработки Eclipse
1. Откройте Eclipse и загрузите пример [inde-dir]/IDEintegration/NDK/samples/hello-jni.
В меню выберите File > New > Project > Android.
Нажмите кнопку Android Project from Existing Code.
В поле Root Directory нажмите кнопку Browse... и выберите папку [ndk-dir]/samples.
Затем щелкните Deselect All и выберите только нужный проект: hello-jni
Снимите флажок Copy projects into workspace.
Нажмите кнопку Finish.
2. Добавьте в проект поддержку нативного кода.
Щелкните имя проекта правой кнопкой мыши и выберите Android Tools > Add Native Support...
Нажмите кнопку Finish.
Примечание. Если после этого шага на консоли появляется сообщение об ошибке Unable to launch cygpath, этот шаг можно пропустить, что не повлияет на проект.
3. Создайте отдельную конфигурацию сборки для каждой целевой платформы, задайте команду сборки.
Щелкните проект правой кнопкой мыши и выберите Project properties -> C/C++ Build -> Manage configurations...
Щелкните New..., чтобы добавить новые конфигурации на основе конфигурации по умолчанию.
Имя: x86_icc Описание: для целевой платформы x86 с помощью компилятора Intel icc
Имя: arm_gcc Описание: для целевой платформы ARM с помощью компилятора GNU gcc
В этом же окне свойств проекта установите для параметра Configuration значение x86_icc.
Снимите флажок Use default build command.
Добавьте следующий текст в поле Build command: ndk-build APP_ABI=x86 NDK_TOOLCHAIN=x86-icc.
Щелкните Apply.
В этом же окне свойств проекта установите для параметра Configuration значение arm_gcc.
Снимите флажок Use default build command.
Добавьте следующий текст в поле Build command: ndk-build APP_ABI=armeabi-v7a NDK_TOOLCHAIN=arm-linux-androideabi-4.8.
Нажмите кнопку Apply, затем нажмите кнопку ОК.
4. Очистка всей рабочей области приложения
Если файл Application.mk существует в папке [eclipse-workspace-dir]HelloJnijni, убедитесь, что он не содержит следующую строку.
NDK_APP.local.cleaned_binaries=true
Щелкните проект правой кнопкой мыши и выберите Build configurations > Clean all….
5. Создайте файл Application.mk в папке [eclipse-workspace-dir]HelloJnijni, если он не существует, и убедитесь, что он содержит следующую строку.
NDK_APP.local.cleaned_binaries=true
6. Соберите двоичный файл для целевой архитектуры ARM* с помощью gcc и для целевой архитектуры x86 с помощью компилятора Intel.
Щелкните проект правой кнопкой мыши и выберите Build Configurations > Build Selected...
Выберите arm_gcc и x86_icc.
Нажмите кнопку ОК.
Проверьте выходные двоичные файлы по следующим адресам.
[eclipse-workspace-dir]HelloJnilibsarmeabi-v7alibhello-jni.so
[eclipse-workspace-dir]HelloJnilibsx86libhello-jni.so
7. Создание неподписанных пакетов приложений
Щелкните проект правой кнопкой мыши и выберите Android Tools > Export Unsigned Application Package...
Примечание о невыполнении очистки двоичных файлов в .libs[targetabi]
Параметр NDK_APP.local.cleaned_binaries=true для отключения удаления собранных ранее библиотек может не работать в будущих версиях NDK. См. [ndk-dir]/build/core/setup-app.mk для получения информации о том, как отключить действия удаления для установленных двоичных файлов.
Прочие статьи по теме и ресурсы
- Методика портирования приложений NDK Android
- Изменение компилятора по умолчанию с компилятора Intel C++ на GCC для целевой платформы x86
- Компилятор Intel® C++ для Mac OS*: совместимость с компиляторами GNU* gcc и g++
- Пакет Android* NDK для архитектуры Intel®
- Ускорение работы эмулятора Android в системах с архитектурой Intel®
Дополнительные сведения о средствах Intel для разработчиков Android см. на сайте Intel® Developer Zone for Android.
Автор: saul