我有一个在大多数Android设备(ARMv5,ARMv7和x86)上都能很好运行的JNI库。
我在ARMv7上使用NEON指令,但我不想在条件/重复的源代码上打乱代码,而是想在库加载时检测Java中的非NEON ARMv7,然后加载v5库:CPU速度很慢。
我发现了一条帖子,建议我在/proc/cpuinfo中寻找“neon”功能,因此我正在对此进行解析,然后加载libthing.so(通常是libthing-v5.so)(如果该设备声称是不带NEON的ARMv7) 。这在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
请您参考如下方法:
我怀疑x86是否会模拟ARM/proc/cpuinfo!?
无论如何,为了从Java中检测本地体系结构,您可以依赖Build.CPU_ABI
和Build.CPU_ABI2
:http://developer.android.com/reference/android/os/Build.html#CPU_ABI,然后仅当CPU_ABI和CPU_ABI2是arm */armeabi-v7a时,才继续解析/proc/cpuinfo以寻找 NEON