如何检测Android x86何时模拟ARM?

and*_*sel 9 x86 arm android-ndk

我有一个在大多数Android设备上运行良好的JNI库 - ARMv5,ARMv7和x86.

我在ARMv7上使用NEON指令,但是我没有使用条件/复制源来混淆代码,而是希望在库加载时检测Java中的非NEON ARMv7,而是加载v5库:慢CPU很慢.

我找到了一篇帖子,建议我在/ proc/cpuinfo中寻找'neon'功能,所以我正在解析它,并且通常加载libthing.so,或者如果设备声称是没有NEON的ARMv7,则加载libthing-v5.so .这在ARM上运行良好.

不幸的是,不仅x86模拟ARM/proc/cpuinfo(!),如果它决定它不理解NEON,那么它也会从armeabiv7a目录中挖掘出libthing-v5.so,并使用它因为没有一个在x86目录中.

我目前的解决方法是将x86库复制到libthing.so和libthing-v5.so,所以如果x86假装是一个没有NEON的ARMv7芯片,那么无论如何它都会得到x86库.

除了基于Yeppp或Android自己的cpufeatures编写我自己的小型独立架构检测库之外,有没有办法从Java确定真正的本地架构?


@ ph0b:这里是Razr i的输出,显示模拟器已经确定应用程序已经安装为'ABI2 58',并且它需要假冒/ proc/cpuinfo.

鉴于两个共享库都可以从x86以及armeabi*目录获得,我不明白为什么设备决定成为ARM.我可能会问我在英特尔的联系.

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
Run Code Online (Sandbox Code Playgroud)

ph0*_*h0b 3

我怀疑 x86 模拟 ARM /proc/cpuinfo !?

不管怎样,为了从Java中检测本地架构,你可以依赖Build.CPU_ABIBuild.CPU_ABI2: http: //developer.android.com/reference/android/os/Build.html#CPU_ABI,然后继续解析/proc/cpuinfo来查看仅当 CPU_ABI 和 CPU_ABI2 为 arm*/armeabi-v7a 时才适用于 neon

  • @ph0b 似乎包含 x86 和 arm-v7 的应用程序在 `Build.CPU_ABI` 和 `Build.CPU_ABI2` 中被检测为“armeabi-v7a”(例如:华硕 Zenfone 设备),如果我们尝试编译一个应用程序以输出 `没有 NDK 的 Build.CPU_ABI*` ,它将显示正确的结果,即 `x86` 和 `armeabi-v7a` ,对此有什么想法吗? (4认同)
  • 请参阅上面 Razri 的奇怪输出,其中显示了 ARM /proc/cpuinfo。它为我的测试应用程序发出 x86 /proc/cpuinfo 。除此之外,我手边的两台 Intel 设备上的 CPU_ABI=x86 和 CPU_ABI2=armeabi-v7a ;我真正的 ARM 设备有 CPU_ABI=armeabi-v7a 和 CPU_ABI2=armeabi,除了一个意外地也是 Intel 的设备(!)。 (3认同)