Wie kann ich feststellen, ob Android x86 ARM emuliert?

9

Ich habe eine JNI-Bibliothek, die auf den meisten Android-Geräten gut läuft - ARMv5, ARMv7 und x86.

Ich benutze NEON-Anweisungen auf ARMv7, aber anstatt den Code mit bedingter / duplizierter Quelle zu überfluten, möchte ich einen Nicht-NEON-ARMv7 in Java beim Laden der Bibliothek entdecken und stattdessen die v5-Bibliothek laden: langsame CPU ist langsam.

Ich habe einen Beitrag gefunden, der darauf hinweist, dass ich nach der "Neon" -Funktion in / proc / cpuinfo suche, also analysiere ich das und lade in der Regel loththing.so oder libthing-v5.so, wenn das Gerät behauptet, ein ARMv7 ohne NEON. Dies funktioniert gut auf ARM.

Leider emuliert x86 nicht nur ein ARM / proc / cpuinfo (!), wenn es entscheidet, dass es NEON nicht versteht, dann gräbt es auch libthing-v5.so aus dem armeabiv7a-Verzeichnis aus und verwendet es, weil es nicht existiert 't eins im x86 Verzeichnis.

Meine aktuelle Problemumgehung besteht darin, die x86-Bibliothek sowohl in lything.so als auch in libthing-v5.so zu kopieren. Wenn also x86 vorgibt, ein NEON-freier ARMv7-Chip zu sein, wird es sowieso die x86-Bibliothek bekommen.

>

Abgesehen davon, dass ich eine kleine eigene eigenständige Architektur-Erkennungsbibliothek auf Basis von Yeppp oder Androids eigenen CPU-Funktionen aufbaut, gibt es eine Möglichkeit, die echte lokale Architektur von Java zu bestimmen?

@ ph0b: Hiermit wird der Ausgang des Razr i angezeigt, der zeigt, dass der Emulator entschieden hat, dass die Anwendung als 'ABI2 58' installiert wurde und dass er / proc / cpuinfo vortäuschen muss.

Da beide shared libraries sowohl in x86 als auch in den Armeabi * -Verzeichnissen verfügbar sind, verstehe ich nicht, warum sich das Gerät als ARM entschieden hat. Ich könnte meinen Kontakt bei Intel dazu fragen.

%Vor%     
android.weasel 04.06.2014, 15:27
quelle

4 Antworten

3

Ich bezweifle, dass das x86 ein ARM / proc / cpuinfo! emuliert?

Wie auch immer, um die lokale Architektur von Java zu erkennen, können Sie sich auf Build.CPU_ABI und Build.CPU_ABI2 verlassen: Ссылка und dann mit der Analyse von / proc / cpuinfo fortfahren, um nach neon zu suchen, wenn CPU_ABI und CPU_ABI2 arm * / armeabi-v7a

sind     
ph0b 04.06.2014, 22:14
quelle
2

Sie können sich nicht auf proc / cpuinfo, getProperty ("os.arch") oder Build.CPU_ABI (2) verlassen. Sie sind alle falsch, wenn die Emulation aktiv ist. Die Art, wie ich die Erkennung mache, analysiere ich die / proc / cpuinfo Suche nach einem Wort "Platzhalter". Es ist in "Hardware:" Zeile. Normalerweise gibt es einen echten Firmennamen wie "Samsung" für Samsung Galaxy, aber im Falle der ARM-Emulation auf x86 sehe ich, dass es nur einen "Platzhalter" in der Hardwarezeile in / proc / cpuinfo gibt. Ich habe es nicht an vielen Gerätemodellen getestet, kann also nicht sagen, wie zuverlässig das ist.

    
Woland 21.05.2015 22:41
quelle
1

Sie können auch den im ELF-Dateiheader definierten e_machine -Wert abrufen, z. B. die Datei libc.so , um festzustellen, welche Architektur angegeben wurde.

Ссылка

Codeausschnitt:

%Vor%

Wenn Build.CPU_ABI anzeigt, dass Sie auf ARM laufen, aber mit dem x86 em in Konflikt geraten, emuliert es!

    
Yrom 12.04.2016 14:59
quelle
0

So schrecklich das klingt, wenn Sie eine andere Liste von nativen Bibliotheken für ARM und x86 haben, dann werden Geräte wie das Programm automatisch dazu übergehen, die Anwendung unter dem ARM-Emulator auszuführen.

Ссылка

    
Christopher Fraser 20.09.2015 11:26
quelle

Tags und Links