我有一个在大多数Android设备上运行良好的JNI库 - ARMv5,ARMv7和x86。
我在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
答案 0 :(得分:3)
我怀疑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
答案 1 :(得分:2)
您不能依赖proc / cpuinfo,getProperty(" os.arch")或Build.CPU_ABI(2)。如果模拟处于活动状态,它们都是假的。我进行检测的方式是解析/ proc / cpuinfo查找单词"占位符"。它来自"硬件:"线。通常有一个真正的公司名称,如#34;三星"对于三星Galaxy,但是在x86上进行ARM仿真的情况下,我看到只有"占位符"在/ proc / cpuinfo中的硬件行。我还没有在很多设备型号上测试它,所以不能说这种方式有多可靠。
答案 2 :(得分:2)
您还可以检索ELF文件头中定义的e_machine
值,例如文件libc.so
,以检测指定的体系结构。
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
代码段:
File libc = new File(Environment.getRootDirectory(), "lib/libc.so"); // or 'lib64' if 64 bit
// assert libc file exsits
RandomAccessFile file = new RandomAccessFile(libc, "r");
file.seek(0x12); // 'e_machine' offset
byte[] buf = new byte[2]; // 2 bytes size
file.readFully(buf);
int em = (buf[0] & 0xff) | ((buf[1] & 0xff) << 8);
file.close();
if(em == 0x03 || em == 0x3E) {
// x86!
}
当Build.CPU_ABI
表示您在ARM上运行但与x86 em
发生冲突时,它正在模拟!
答案 3 :(得分:0)
听起来很糟糕如果你有一个不同的ARM和x86本机库列表,那么像这样的设备会自动切换到在ARM模拟器下运行应用程序。
https://software.intel.com/en-us/forums/android-applications-on-intel-architecture/topic/518471