我怎么能当Android的的x86是模拟ARM检测? [英] How can I detect when Android x86 is emulating ARM?

查看:501
本文介绍了我怎么能当Android的的x86是模拟ARM检测?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有大多数Android设备上运行良好JNI的图书馆 - 的ARMv5,ARMv7的,和x86

我使用的是ARMv7的NEON指令,但不是弄乱code有条件/复制来源,我想检测非NEON的ARMv7在Java中的库加载时间,并加载V5库,而不是: CPU慢很慢。

我发现了一个帖子暗示我寻找在/ proc内/ cpuinfo的'霓虹灯'功能,所以我的解析和加载通常libthing.so,或者如果设备自称是一名libthing-v5.so ARMv7的NEON没有。这很好地工作在ARM。

不幸的是不仅86模拟一个ARM的/ proc内/ cpuinfo(!),如果决定不明白NEON那么它也挖掘出从armeabiv7a目录libthing-v5.so,并使用它,因为有ISN 't的一在x86目录。

我目前的解决方法就是对x86的库复制到两个libthing.so和libthing-v5.so所以如果是86 pretending是一个免费的霓虹灯ARMv7的芯片,它会反正得到的x86库。

除了做饭了我自己的基于Yeppp或Android自身cpufeatures的一个微小的独立架构的检测库,有没有一种方法来确定从Java真正的当地建筑?


@ ph0b:Razr手机的我谨此的输出,显示该仿真器已决定应用程序已经安装为一个'ABI2 58',那它需要假出来的/ proc内/ cpuinfo

鉴于这两个共享库可从86还有armeabi *目录,我不明白为什么该设备已决定为ARM。我可能会在英特尔问我接触这个。

  10月6日至五日:58:41.360 17807 18053ðdalvikvm:试图加载的lib /data/data/com.company.android/lib/libmp.so 0x42409cb0
10月6日至五日:58:41.360 17807 18053ðdalvikvm:增加了共享库/data/data/com.company.android/lib/libmp.so 0x42409cb0
10月6日至五日:58:41.370 17807 18053ðdalvikvm:没有JNI_OnLoad在/data/data/com.company.android/lib/libmp.so 0x42409cb0发现,跳过的init
10月6日至五日:58:41.420 17807 18053 D:搜索安装了ABI2的UID包:10109
10月6日至五日:58:41.420 17807 18053 D:应用与ABI2 58访问的/ proc内/ cpuinfo
10月6日至五日:58:41.430 17807 18053我的System.out:#这里是大部分的/ proc内/ cpuinfo
10月6日至五日:58:41.430 17807 18053我的System.out:#Thu 6月5日10点58分41秒GMT + 01:00 2014年
10月6日至五日:58:41.430 17807 18053我的System.out:串行= 0000000000000001
10月6日至五日:58:41.430 17807 18053我的System.out:版本= 0001
10月6日至五日:58:41.430 17807 18053我的System.out:CPU =版本\\ t \\:1
10月6日至五日:58:41.430 17807 18053我的System.out:BogoMIPS = 1500
10月6日至五日:58:41.430 17807 18053我的System.out:硬件=占位符
10月6日至五日:58:41.430 17807 18053我的System.out:特点= VFP SWP一半拇指fastmult EDSP VFPv3的
10月6日至五日:58:41.430 17807 18053我的System.out:处理器=的ARMv7处理器转1(v7l)
10月6日至五日:58:41.430 17807 18053我NativeWahooLibrary:检测到的ARMv7处理器转1(v7l)(= ARMv7的,真)与(氖@ -1)VFP SWP一半拇指fastmult EDSP VFPv3的
10月6日至五日:58:41.430 17807 18053ðdalvikvm:试图加载非霓虹灯LIB /data/data/com.company.android/lib/libwahoo-v5.so 0x42409cb0


解决方案

我怀疑在x86模拟一个ARM的/ proc内/ cpuinfo!?

总之,为了检测从Java当地的建筑,你可以依靠 Build.CPU_ABI Build.CPU_ABI2 http://developer.android.com/reference/android/ OS / Build.html#CPU_ABI ,然后继续解析的/ proc内/ cpuinfo寻找霓虹只有CPU_ABI和CPU_ABI2是ARM * / armeabi-V7A

I have a JNI library that runs well on most Android devices - ARMv5, ARMv7, and x86.

I'm using NEON instructions on ARMv7, but instead of cluttering the code with conditional/duplicated source, I want to detect a non-NEON ARMv7 in Java at library load time, and load the v5 library instead: slow CPU is slow.

I found a post suggesting that I look for the 'neon' feature in /proc/cpuinfo, so I'm parsing that, and loading libthing.so usually, or libthing-v5.so if the device claims to be an ARMv7 without NEON. This works nicely on ARM.

Unfortunately not only does x86 emulate an ARM /proc/cpuinfo(!), if it decides it doesn't understand NEON then it also digs out the libthing-v5.so from the armeabiv7a directory, and uses it because there isn't one in the x86 directory.

My current workaround is just to copy the x86 library to both libthing.so and libthing-v5.so so if x86 is pretending to be a NEON-free ARMv7 chip, it'll get the x86 library anyway.

Aside from cooking up a tiny standalone architecture-detecting library of my own based on Yeppp or Android's own cpufeatures, is there a way to determine the genuine local architecture from Java?


@ph0b: Herewith the output of the Razr i, showing that the emulator has decided that the application has been installed as an 'ABI2 58', and that it needs to fake out /proc/cpuinfo.

Given that both shared libraries are available from x86 as well as the armeabi* directories, I don't understand why the device has decided to be an ARM. I might ask my contact at Intel about this.

06-05 10:58:41.360 17807 18053 D dalvikvm: Trying to load lib /data/data/com.company.android/lib/libmp.so 0x42409cb0
06-05 10:58:41.360 17807 18053 D dalvikvm: Added shared lib /data/data/com.company.android/lib/libmp.so 0x42409cb0
06-05 10:58:41.370 17807 18053 D dalvikvm: No JNI_OnLoad found in /data/data/com.company.android/lib/libmp.so 0x42409cb0, skipping init
06-05 10:58:41.420 17807 18053 D         : Searching package installed with ABI2 with Uid: 10109 
06-05 10:58:41.420 17807 18053 D         : Apps with ABI2 58 accessing /proc/cpuinfo 
06-05 10:58:41.430 17807 18053 I System.out: #Here's most of /proc/cpuinfo
06-05 10:58:41.430 17807 18053 I System.out: #Thu Jun 05 10:58:41 GMT+01:00 2014
06-05 10:58:41.430 17807 18053 I System.out: Serial=0000000000000001
06-05 10:58:41.430 17807 18053 I System.out: Revision=0001
06-05 10:58:41.430 17807 18053 I System.out: CPU=revision\t\: 1
06-05 10:58:41.430 17807 18053 I System.out: BogoMIPS=1500
06-05 10:58:41.430 17807 18053 I System.out: Hardware=placeholder
06-05 10:58:41.430 17807 18053 I System.out: Features=vfp swp half thumb fastmult edsp vfpv3 
06-05 10:58:41.430 17807 18053 I System.out: Processor=ARMv7 processor rev 1 (v7l)
06-05 10:58:41.430 17807 18053 I NativeWahooLibrary: Detected ARMv7 processor rev 1 (v7l) (=ARMv7, true) with (neon@-1) vfp swp half thumb fastmult edsp vfpv3 
06-05 10:58:41.430 17807 18053 D dalvikvm: Trying to load non-neon lib /data/data/com.company.android/lib/libwahoo-v5.so 0x42409cb0

解决方案

I doubt the x86 emulates an ARM /proc/cpuinfo !?

Anyway, in order to detect the local architecture from Java, you can rely on Build.CPU_ABI and Build.CPU_ABI2: http://developer.android.com/reference/android/os/Build.html#CPU_ABI, and then continue parsing /proc/cpuinfo to look for neon only if CPU_ABI and CPU_ABI2 are arm*/armeabi-v7a

这篇关于我怎么能当Android的的x86是模拟ARM检测?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆