Используйте ARMCC для компиляции нативной библиотеки Android

Я работал над проектом Android, который имеет несколько собственных библиотек C++. Компиляция и отладка с использованием Eclipse с плагином ADT работает хорошо. Очевидно, что Android NDK использует arm-linux-gnueabi-gcc некоторой версии для компиляции нативных библиотек.

Поскольку я интенсивно использую встроенные функции NEON, я хотел бы попытаться скомпилировать нативные библиотеки с помощью официального компилятора ARM. armcc, Я везде читал, что armcc должен давать более оптимизированный код при использовании встроенных функций. Поэтому я скачал пробную версию DS-5 с веб-сайта ARM, просто чтобы проверить, есть ли разница в скорости.

DS-5, похоже, является всего лишь модифицированной версией Eclipse, которая использует набор инструментов ARMCC, поэтому я установил плагин ADT. Но когда я компилирую с использованием DS-5, кажется, что код все еще генерируется с использованием gcc скорее, чем armcc,

Есть ли у вас какие-либо идеи, как заставить DS-5 или Eclipse создавать собственный код Android, используя armcc? Или возможно (и как) создать статические библиотеки NDK из командной строки, а затем заменить библиотеки в моем проекте, чтобы они были развернуты на тестовом телефоне?

2 ответа

Решение

ARM DS-5 Community Edition не включает в себя ARM compiler (armcc).

Если бы вы могли получить armcc Лучше всего было бы разделить ваши сложные алгоритмы обработки на отдельные блоки компиляции (отдельные файлы C), собрать их с помощью armcc как вы сделали бы для любого модуля компиляции. Когда вы получите объектные файлы, преобразуйте их в архив и используйте в Android.mk как LOCAL_STATIC_LIBRARIES += <your_archive>,

Вы не можете использовать armcc просто создавать Android-совместимые библиотеки в основном из-за Bionic зависимости, я думаю.

Ты можешь использовать armcc создавать Android-совместимые статические библиотеки, хотя Android имеет другую библиотеку C (bionic). Ключ является --library_interface флаг для armcc, Согласно документации:

Используйте параметр формы --library_interface=aeabi_* при связывании с ABI-совместимой C-библиотекой. Параметры в форме --library_interface=aeabi_* гарантируют, что компилятор не будет генерировать вызовы для каких-либо оптимизированных функций, предоставляемых библиотекой ARM C.

Кроме того, есть еще несколько флагов для обеспечения совместимости с EABI Android, что приводит к следующей команде для Android armeabi-v7a цель:
armcc --library_interface=aeabi_clib --wchar32 --enum_is_int --no_hide_all --cpu=7-A --fpu=softvfp+vfpv3 -c -o libfunc.o libfunc.c

Вы можете использовать armar --create libfunc.a libfunc.o создать статическую библиотеку, которая может быть связана с Android NDK как LOCAL_STATIC_LIBRARIES,

Я успешно проверил это с Android NDK r10d на Android KitKat 4.4.2.

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