iPhone检测处理器型号/ NEON支持

时间:2009-10-21 13:42:28

标签: iphone arm ipod-touch neon

我正在寻找一种方法来在运行时区分配备新ARM处理器的设备(例如iPhone 3GS和一些iPod 3G)以及配备旧ARM处理器的设备。 我知道我可以使用uname()来确定设备型号,但由于只有部分iPod接触3G的ARM处理器得到了提升,这还不够。

因此,我正在寻找其中一个:

  1. 一种检测处理器模型的方法 - 我想没有。
  2. 确定是否支持ARM霓虹灯指令的方法 - 由此我可以得出答案。
  3. 一种确定设备总存储空间大小的方法 - 将其与已知的设备模型相结合,可能会让我得到答案。
  4. <输入RANDOM IDEA>
  5. 提前致谢:)

4 个答案:

答案 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是否可用,因为新的处理器能够实现这一点。

如何做article at mobileorchard

答案 2 :(得分:1)

编辑:我已经撤回了这个答案,因为它遗漏了我后来意识到的一个明显的漏洞:当我们在未来的某些硬件上获得未知的子类型时该怎么办?这不是未来的证明。此外,鉴于Apple对未记录API的使用零容忍,该API记录状态的不确定性无济于事。

您应该使用Stephen Canon的答案并构建您的应用程序。目前,可靠的,面向未来的运行时检测是不可行的(令我沮丧的是,我保证)。

答案 3 :(得分:0)

我知道这很糟糕,但我想到的最好的是检测设备是否支持视频录制。目前只有基于ARM7的iPhone和iPod设备支持它,因此我认为这是一种合法的方式。

为此,请在kUTTypeMovie上使用UIImagePickerController的availableMediaTypesForSourceType和isSourceTypeAvailable。