Используйте 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.