10

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

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

  1. 一种检测处理器型号的方法——我想没有。
  2. 一种确定是否支持 ARM neon 指令的方法 - 从中​​我可以得出一个答案。
  3. 一种确定设备总存储大小的方法 - 将其与已知的设备模型结合起来可能会让我找到答案。
  4. <输入随机想法>

提前致谢 :)

4

4 回答 4

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参数可能对您有用。

于 2009-10-21T14:34:23.540 回答
5

我能想到的一种解决方法是检测 OpenGL ES 2.0 是否可用,因为较新的处理器启用了它。

mobileorchard上有一篇关于如何做到这一点的文章。

于 2009-10-21T14:18:34.013 回答
1

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

您应该使用斯蒂芬佳能的答案并构建您的应用程序。目前,可靠的、面向未来的运行时检测是不可行的(我向你保证,我很沮丧)。

于 2010-04-06T14:14:03.057 回答
0

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

为此,请将 UIImagePickerController 的 availableMediaTypesForSourceType 与 kUTTypeMovie 上的 isSourceTypeAvailable 结合使用。

于 2009-11-14T23:26:48.800 回答