Мы создаем библиотеку C ++ (скажем, libCore
), которая будет использоваться из другой библиотеки C ++ (скажем, libClient
).Мы используем Android NDK
(использует clang
) с CMake
.
В нашем случае мы имеем несколько сборок libCore
, оптимизированных на основе функций процессора, доступных на целевых устройствах.Например, libCore-neon
для устройств с ARM NEON fpu и libCore-simd
для устройств без NEON.
Кстати, эти libCore-xxxx созданы из одного и того же исходного кода.Единственное отличие состоит в том, что libCore-neon
построен с флагами компилятора, специфичными для NEON (-mfpu=neon
), которые не используются для libCore-simd
.
Теперь libClient
должен проверить, имеет ли устройство NEON во время выполнения, и использоватьlibCore-neon
, если нет, он должен использовать libCore-simd
.
Одним из решений является загрузка библиотеки во время выполнения с использованием dlopen
.Мы не предпочитаем его, так как не считаем его безопасным для использования во всех версиях Android.
Все они принадлежат одной и той же кодовой базе.Не имеет значения, являются ли эти библиотеки статическими или общими.Они даже не должны быть отдельными библиотеками.Мы просто хотим избежать дублирования кода, так как один и тот же код компилируется с разными флагами.
Есть ли какой-то другой подход, который мы можем использовать для запуска наиболее оптимизированного кода, работающего на соответствующих устройствах?