其实我们如果不同CPU下,使用不同的so库的话,其实就没必要每个CPU对应文件下面都需要有相同的so库,只要你可以判断当前手机的CPU,就可以决定这个CPU只加载哪些so库。
先看一下,如果我们在电脑上用usb连接之后可以使用命令行查看CPU信息。
adb shell
cat /proc/cpuinfo
但是在这里我需要在代码中判断CPU是32位的还是64位的,我们用下面代码判断,和命令行类似,代码中去读取/proc/cpuinfo下的信息。
下面这段代码参考自:https://blog.csdn.net/wangbaochu/article/details/47723265
public static boolean isCPUInfo64() {
File cpuInfo = new File("/proc/cpuinfo");
if (cpuInfo != null && cpuInfo.exists()) {
InputStream inputStream = null;
BufferedReader bufferedReader = null;
try {
inputStream = new FileInputStream(cpuInfo);
bufferedReader = new BufferedReader(new InputStreamReader(inputStream), 512);
String line = bufferedReader.readLine();
if (line != null && line.length() > 0 && line.toLowerCase(Locale.US).contains("arch64")) {
return true;
}
} catch (Throwable t) {
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (inputStream != null) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return false;
}
问题场景是相同功能我们需要在64位手机上和32位手机上调用不同的so库去实现这个功能。
所以我在加载so的时候去判断一下本机的是否是64位的,如果是64位的去加载64位所需要的so库,反之则去加载32位所需要的so库,然后在通过native方法去链接到两个so库中的方法。
static {
if(isCPUInfo64()){
System.loadLibrary("xxx");
}else {
System.loadLibrary("xxx");
}
}
public native void 64位so库接口();
public native void 32位so库接口();
在调用该功能的时候我们判断CPU,然后进行区别调用功能。
如果CMakeLists中有需要判断CPU架构的话,我们可以通过下面判断,而且如果我们编译的C或C++代码中也同样有需要判断CPU架构的话我们可以加对应的宏,就像下面add_definitions(-D IS_ARM64-V8)一样
if(${ANDROID_ABI} STREQUAL "arm64-v8a") //判断CPU架构是否是 arm64-v8a 的
//如果在C或C++代码中也同样有需要判断CPU架构的话我们可以加对应的宏
add_definitions(-D IS_ARM64-V8)
else()
endif()
如果对您有帮助,可否点个赞