2013-12-12 3 views
0

Я использую порт 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 и организовать библиотеки.

+0

Создайте две разные версии одной и той же библиотеки, затем загрузите их правильно во время выполнения. – auselen

+0

@auselen: это очевидное решение, но я не хотел, чтобы динамическая загрузка библиотеки (или построение ее на .so, если на то пошло, но это не так уж и важно). –

+0

Я бы просто спрятал устройства без неона: ARMv6 слишком стар. Даже если кто-то все еще использует телефон Android с ARMv6, он почти ничего не скачивает. Tegra2 не так уж и старый, но слишком мелкий, что это будет очень больно. –

ответ

1

Старый вопрос, но я добавлю к нему в любом случае на всякий случай. Кто-то вникал в детали, и одна из проблем динамически выбирала NEON. Это объясняется здесь: https://stackoverflow.com/a/20697814/712413.

Соответствующий раздел - это элемент 4, чтобы изменить некоторые строки в методе init_simd().