Как код Java может проверить количество регистров с плавающей запятой?

У нас есть нативная библиотека (весь игровой движок и код игры), которая состоит из двух разных версий. Одна версия, которая поддерживает armeabi-v7a с 32 регистрами с плавающей запятой и инструкциями Neon SIMD, и другая версия, которая поддерживает armeabi-v7a с 16 регистрами с плавающей запятой (для использования, например, на устройствах Tegra 2) и, следовательно, не использует инструкции Neon SIMD, поскольку это не будет Работа.

Когда наша игра запускается, мы находимся в стране Java, чтобы выполнить некоторые настройки, а затем загрузить правильную библиотеку. Теперь, как мне узнать, какую библиотеку загрузить? Одним из решений было бы добавить еще одну нативную библиотеку, кроме двух, упомянутых выше, которая имеет только метод вызова JNI для проверки поддержки оборудования с помощью NDK... но, конечно же, должен быть способ проверить это из Java?

Я попытался распечатать все, что было найдено в классе android.os.Build, и получил их, но я не вижу, что здесь использовать:

BOARD: EeePad
BOOTLOADER: unknown
BRAND: asus
CPU_ABI: armeabi-v7a
CPU_ABI2: armeabi
DEVICE: TF101
DISPLAY: IML74K.WW_epad-9.2.1.27-20120615
FINGERPRINT: asus/WW_epad/TF101:4.0.3/IML74K/WW_epad-9.2.1.27-20120615:user/release-keys
HARDWARE: ventana
HOST: Mars
ID: IML74K
MANUFACTURER: asus
MODEL: Transformer TF101
PRODUCT: WW_epad
RADIO: unknown
SERIAL: 037c708543204317
TAGS: release-keys
TYPE: user
USER: unknown

person Ricky Helgesson    schedule 29.11.2013    source источник
comment
К сожалению, похоже, вам придется добавить еще одну нативную библиотеку, чтобы проверить поддержку оборудования. Взгляните на пример hello-neon: github.com/android/ platform_development/tree/master/ndk/samples/   -  person Nachi    schedule 29.11.2013


Ответы (1)


Вы можете попробовать прочитать /proc/cpuinfo, который должен содержать строку, Features : сообщающую вам о возможности ядра, на котором вы находитесь.

Например, на моем Xperia Z1 он показывает:

Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt

Должно быть легко обрабатывать содержимое этой строки со слоя Android/Java.

Это также то, что NDK делает, когда вы вызываете android_getCpuFeatures().

person auselen    schedule 03.12.2013
comment
В итоге я использовал некоторый код из pi4j, который является реализацией Java для Raspberry Pie. Он сделал именно то, что вы предлагаете, и это сработало просто отлично. pi4j.com - person Ricky Helgesson; 16.12.2013