Android 区分32位64位 兼容CPU32位与64位调用不同so库中的接口

其实我们如果不同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()

 

如果对您有帮助,可否点个赞

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值