检查android中的处理器功能

时间:2014-04-29 14:41:28

标签: android android-ndk ffmpeg cpu

我在应用中使用FFMPEG,并且我使用以下配置:

--extra-cflags=' -march=armv7-a -mfloat-abi=softfp -mfpu=neon'

我的目标是4.0+所以我相信armv7-a应该得到大多数非英特尔设备的支持,而且我确信大多数设备都支持霓虹灯扩展,但我还是不知道我怎么能找到所有2000多台设备。

有没有办法在Android中检查处理器类型和扩展程序和/或在Google Play商店中将apk限制为使用某些处理器的设备?

1 个答案:

答案 0 :(得分:2)

我先回答你的最后一个问题:你可以将apk限制在Play商店中具有某些处理器的设备上,但不能限制你正在寻找的粒度。

简而言之:如果您仅为armv7-a上传包含本机库的apk,则无法从x86,mips或armv6设备下载。但选择就此停止:NEON和非NEON设备都被认为是armv7-a设备,因此无法解决您的问题。检查必须在运行时完成。

在Android上检查Java中的处理器体系结构和功能并不容易:没有API。

另一方面,这可以使用NDK轻松完成,NDK包含cpufeatures模块(您可以在NDK安装文件夹中找到有关它的文档)。这个模块让你:

  • 使用android_getCpuFamily()
  • 查找设备的架构
  • 使用android_getCpuFeatures()获取其他详细信息:这是您正在寻找的内容,因为这些详细信息包含指示NEON兼容性的ANDROID_CPU_ARM_FEATURE_NEON标记!

实际上,实现一个JNI函数(如下面的函数)并从Java调用它应该可以解决这个问题:

#include <jni.h>
#include <cpu-features.h>

jboolean
Java_com_my_namespace_MyClass_isNeon
(JNIEnv *env, jclass class) {
  uint64_t features = android_getCpuFeatures();
  if ((android_getCpuFamily() != ANDROID_CPU_FAMILY_ARM)  ||
      ((features & ANDROID_CPU_ARM_FEATURE_NEON) == 0  )) {
    return JNI_FALSE;
  }
  else {
    return JNI_TRUE;
  }
}

如果设备是ARMv7 并且具有NEON功能,则会返回true,否则为false