我正在寻找一种方法来在运行时区分配备新ARM处理器的设备(例如iPhone 3GS和一些iPod 3G)以及配备旧ARM处理器的设备。 我知道我可以使用uname()来确定设备型号,但由于只有部分iPod接触3G的ARM处理器得到了提升,这还不够。
因此,我正在寻找其中一个:
提前致谢:)
答案 0 :(得分:12)
不完全是您所要求的,但一个简单的解决方案是构建您的应用程序胖,以便它包含ARMv6和ARMv7的可执行代码。如果这样做,相应的代码将自动在处理器上运行,您无需进行任何运行时检查。实际上,您可以让加载程序为您执行运行时检测。
为此,将XCode项目中的Architectures设置从“Standard(armv6)”更改为“Optimized(armv6 armv7)”
然后,在您的实现中,您执行此操作:
#if defined __ARM_NEON__
// Code that uses NEON goes here
#else // defined __ARM_NEON__
// Fallback code without NEON goes here
#endif // defined __ARM_NEON__
有一个类似的宏可用于检查(非NEON)ARMv7功能,我不记得这些功能。
如果您真的想要进行运行时调度,请查看libc中的sysctlbyname函数。具体来说,我认为查找HW_MACHINE_ARCH
参数可能对您有用。
答案 1 :(得分:5)
我能想到的一个解决方法是检测OpenGL ES 2.0是否可用,因为新的处理器能够实现这一点。
答案 2 :(得分:1)
您应该使用Stephen Canon的答案并构建您的应用程序。目前,可靠的,面向未来的运行时检测是不可行的(令我沮丧的是,我保证)。
答案 3 :(得分:0)
我知道这很糟糕,但我想到的最好的是检测设备是否支持视频录制。目前只有基于ARM7的iPhone和iPod设备支持它,因此我认为这是一种合法的方式。
为此,请在kUTTypeMovie上使用UIImagePickerController的availableMediaTypesForSourceType和isSourceTypeAvailable。