我遇到的问题似乎只会影响运行姜饼或更高版本的双核Android设备。我想仅针对符合该标准的用户提供有关此问题的对话框。我知道如何检查操作系统级别,但没有找到任何可以明确告诉我设备使用多核的内容。
有什么想法吗?
答案 0 :(得分:42)
不幸的是,对于大多数Android设备,availableProcessors()方法无法正常工作。偶数/ proc / stat并不总是显示正确的CPU数量。
我发现确定CPU数量的唯一可靠方法是枚举/ sys / devices / system / cpu / as described in this forum post中的虚拟CPU列表。代码:
/**
* Gets the number of cores available in this device, across all processors.
* Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu"
* @return The number of cores, or 1 if failed to get result
*/
private int getNumCores() {
//Private Class to display only CPU devices in the directory listing
class CpuFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
//Check if filename is "cpu", followed by one or more digits
if(Pattern.matches("cpu[0-9]+", pathname.getName())) {
return true;
}
return false;
}
}
try {
//Get directory containing CPU info
File dir = new File("/sys/devices/system/cpu/");
//Filter to only list the devices we care about
File[] files = dir.listFiles(new CpuFilter());
//Return the number of cores (virtual CPU devices)
return files.length;
} catch(Exception e) {
//Default to return 1 core
return 1;
}
}
这个Java代码应该适用于任何Android应用程序,即使没有root。
答案 1 :(得分:8)
如果您正在使用本机应用程序,则应尝试以下操作:
#include <unistd.h>
int GetNumberOfProcessor()
{
return sysconf(_SC_NPROCESSORS_CONF);
}
它适用于我的i9100(availableProcessors()返回1)。
答案 2 :(得分:4)
您可以尝试使用此答案中建议的Runtime.availableProcessors()
Is there any API that tells whether an Android device is dual-core or not?
--- ---编辑
更详细的说明见Oracle's site
availableProcessors
public int availableProcessors()
返回Java虚拟机可用的处理器数。
在特定的虚拟机调用期间,此值可能会更改。因此,对可用处理器数量敏感的应用程序应偶尔轮询此属性并适当调整其资源使用情况。
<强>返回:强>
虚拟机可用的最大处理器数量;永远不会小于一个
<强>时间:强>
1.4
答案 3 :(得分:4)
这很简单。
int numberOfProcessors = Runtime.getRuntime().availableProcessors();
通常它将返回1或2. 2将在双核CPU中。
答案 4 :(得分:1)
这是我在Kotlin中基于this one的解决方案:
public partial class Form1 : Form
{
private Capture capture;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
if (capture == null)
capture = new Capture();
Image<Bgr,Byte> img=capture.QueryFrame();
imageBox1.Image = img;
}
}
答案 5 :(得分:0)
我将两种可用的解决方案结合使用:
fun getCPUCoreNum(): Int {
val pattern = Pattern.compile("cpu[0-9]+")
return Math.max(
File("/sys/devices/system/cpu/")
.walk()
.maxDepth(1)
.count { pattern.matcher(it.name).matches() },
Runtime.getRuntime().availableProcessors()
)
}