Я использую порт libjpeg-turbo для Android. Он не сильно отличается от базового jpeg-turbo с точки зрения исходного кода: http://git.linaro.org/gitweb?p=people/tomgall/libjpeg-turbo/libjpeg-turbo.git;a=shortlog;h=refs/heads/androidlibjpeg-turbo для Android: как организовать выборку времени выполнения кода NEON/non-NEON?
Существует модуль (статическая библиотека), состоящий из 2 cpu-зависимых файлов: jsimd_arm_neon.S и jsimd_arm.c. Я хочу скомпилировать jpeg-turbo с поддержкой NEON, я должен определить __ARM_HAVE_NEON
и скомпилировать этот модуль с -march=armv7-a -mfpu=neon
. Я хочу, чтобы библиотека работала на более старом оборудовании без поддержки Neon (например, Tegra 2), я должен удалить флаг компилятора neon и undef __ARM_HAVE_NEON
.
Мой вопрос: как скомпилировать его так, чтобы можно было выбрать неоновый или неонный путь во время выполнения без SIGILL
на неонном оборудовании? Я знаю, как проверить NEON во время выполнения, но я не знаю, как изменить libjpeg-turbo и организовать библиотеки.
Создайте две разные версии одной и той же библиотеки, затем загрузите их правильно во время выполнения. – auselen
@auselen: это очевидное решение, но я не хотел, чтобы динамическая загрузка библиотеки (или построение ее на .so, если на то пошло, но это не так уж и важно). –
Я бы просто спрятал устройства без неона: ARMv6 слишком стар. Даже если кто-то все еще использует телефон Android с ARMv6, он почти ничего не скачивает. Tegra2 не так уж и старый, но слишком мелкий, что это будет очень больно. –