正在检查android中的处理器功能



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

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

我的目标是4.0+,所以我相信armv7-a应该得到大多数非英特尔设备的支持,我相信大多数设备也支持neon扩展,但我不确定如何在所有2000+设备中找到它。

有没有办法在安卓系统中检查处理器类型和扩展和/或在谷歌Play商店中将apk限制在具有特定处理器的设备上?

我将首先回答您最后一个问题:您可以将apk限制在Play Store上具有特定处理器的设备上,但不能使用您想要的粒度。

简言之:如果你上传了一个只针对armv7-a的包含本机libs的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

最新更新